C语言字符串输入问题

来源:百度知道 编辑:UC知道 时间:2024/06/04 16:35:10
#include<stdio.h>
main()
{ char str[5];
scanf("%s",str);
printf("%s,%d\n",str,sizeof(str));
}
执行以上程序后 我如果输入asdfghjk,
,打印输出也是asdfghjk
我只定义了str是拥有5个字符的字符串,为什么不管我输入多少个字符他都照样输出?我觉得应该时只输出前5个么?而且不管我输入多少个,sizeof的值都是5,请高手解释
char str[5];
int a;
scanf("%s%d",str,a);
printf("%s,%d,%d\n",str,a,sizeof(str)); 我如果输入asd 回车 然后在输入 1 程序提示段错误 ,为什么?按理说应该是把asd存入str,把1存入a么.就是忘了加&,哪位大哥说加了也不行,为什么?我感觉多出的那个就不应该显示出来,我就没有为他分配空间么。好比说一个房子只能住1个人,第二个人就不应该进去,因为根本就没有他的地方。

首先,sizeof(str)的值肯定是5,这个没什么好说的,和你输入多少个字符没有关系。

关于你发现的问题,请注意scanf和printf调用当中传递给函数的两个参数str实际上(或者说本质上)都是字符型的指针,意思是说你只是告诉了函数一个内存当中的地址而已,并不包含任何关于字符串长度的信息。

scanf函数只负责把你输入的一串字符保存到内存中从你指定的那个地址开始的空间中去,并不负责检查你输入的字符串是否实际超出了你定义的字符数组的长度。这里一个很严重的问题是:虽然好像你输入了多的字符也保存起来了,但实际山是占用了非法的内存空间保存起来的,也就是不属于str字符数组的空间。
对于像scanf这类输入函数不检查用户输入是否合理合法就保存的做法是非常危险的。(原因是因为涉及到了指针的操作了。)换句话说,这样的代码是非常脆弱的。(不健壮)

而对于printf函数,道理差不多。你只是给出了一个地址,然后printf函数就从这个地址开始读入数据并转换输出,对于%s指示符而言,直到读出的字符是“空字符”为止。

要想完全正确理解这个现象,需要对指针的概念有比较正确的认识。

scanf("%s",str); 这样写的话,str就相当于指针了.char str[5]等价于char *str;
你可以这样:
#include<stdio.h>
main()
{ char str[5]; int i;
for(i=0;i<5;i++)
scanf("%c",&str[i]);
for(i=0;i<5;i++)
printf("%c",str[i]);
printf("\n");
printf("%d",sizeof(str));
}

sizeof()函数会去栈区找参数(例如变量str,如果是类或者数据类型就不在栈区),根据参数的定义来计算大小。

至于你输入了 多个字符,其实是数组 越界了。