C语言字符串输入问题。怎么办?
首先,sizeof(str)的值肯定是5,这个没啥好说的,和你输入多少个字符木有关系。关于你发现的问题,请注意scanf和printf调出使用当中传递给函数的2个参数str实际上(或说本质上)都是字符型的指针,意思是说你只是告知了函数1个内存当中的地址而已,并不包含任何关于字符串长度的信息。 scanf函数只负责把你输入的一串字符保存到内存中从你指定的那个地址开始的空间中去,并不负责检查你输入的字符串是不是实际超出了你定义的字符数组的长度。这里1个很严重的问题是:虽然貌似你输入了多的字符也保存起来了,但实际山是占用了非法的内存空间保存起来的,也就是不属于str字符数组的空间。 对于像s...全部
首先,sizeof(str)的值肯定是5,这个没啥好说的,和你输入多少个字符木有关系。关于你发现的问题,请注意scanf和printf调出使用当中传递给函数的2个参数str实际上(或说本质上)都是字符型的指针,意思是说你只是告知了函数1个内存当中的地址而已,并不包含任何关于字符串长度的信息。
scanf函数只负责把你输入的一串字符保存到内存中从你指定的那个地址开始的空间中去,并不负责检查你输入的字符串是不是实际超出了你定义的字符数组的长度。这里1个很严重的问题是:虽然貌似你输入了多的字符也保存起来了,但实际山是占用了非法的内存空间保存起来的,也就是不属于str字符数组的空间。
对于像scanf这类输入函数不检查用户输入是不是合理合法就保存的做法是非常危险的。(原因是由于涉及到了指针的操作了。)换句话说,这样的代码是非常脆弱的。(不健壮)而对于printf函数,道理差不多。
你只是给出了1个地址,之后printf函数就从这个地址开始读入数据并转换输出,对于%s指示符而言,直到读出的字符是“空字符”为止。要想完全正确理解这个现象,要对指针的概念有比较正确的认识。收起