[求助]用scanf如何接收带空格的字符串?
用scanf如何接收带空格的字符串?----------------解决方案--------------------------------------------------------
单个接收就是了
如:
char s[5];
int i;
for(i=0;i<5;i++)
scanf("%c",&s[i]);
----------------解决方案--------------------------------------------------------
奇怪了~,我以为可以用scanf("%s",s);接收,但是一遇到空格就停止接收了,这是scanf函数的一个特性吗?为什么用单个字符就可以接收呢?
----------------解决方案--------------------------------------------------------
不是说%s就不能接收了,也可以接收,只是你输入的时候出的问题:
比如输入 zk er,
输入zk没有问题,但遇到空格就不行了,我猜可能是因为scanf认为空格就是字符串的结束,把它当成了NULL,然后对之后的字符就不考虑了。
你可以用以下的方法实验一下就知道了:
main()
{
int i;
char s[5];
clrscr();
scanf("%s",&s);
for(i=0;i<5;i++)
printf("%x ",s[i]);
getch();
}
你输入zk er ,会看到输出到空格时就变成0了。
----------------解决方案--------------------------------------------------------
是呀,而gets就没有这种情况,,也许因为这个原因所以很少人用scanf吧?谢谢edgeman回答我的疑问!
----------------解决方案--------------------------------------------------------
以下是引用zker在2005-5-13 11:38:44的发言:
奇怪了~,我以为可以用scanf("%s",s);接收,但是一遇到空格就停止接收了,这是scanf函数的一个特性吗?为什么用单个字符就可以接收呢?
对,这是scanf的一个结束特性
当输入遇到空格,制表符,回车等时都会结束!!!
----------------解决方案--------------------------------------------------------
gets 函数能实现空格输入,然而 gets 函数是个不推荐使用的函数, 因为它有个能致命的缺陷,就是不能指定缓冲区,当输入的字符大于缓冲区写入的空间, 会使缓冲区溢出,这将有可能会导致不可预料的错误,这种错误可能是非常严重的。 建议使用 fgets 来代替。 缓冲区溢出的相关信息,你可以查看 缓冲溢出攻击及安全防范体系 [URL=http://www.yesky.com/SoftChannel/72356682675519488/20030823/1723624_1.shtml]http://www.yesky.com/SoftChannel/72356682675519488/20030823/1723624_1.shtml[/URL] Internet 上有很多关于避免这种意外的处理方法,有兴趣的可以去找找。
----------------解决方案--------------------------------------------------------
用gets()吧,因为scanf()函数遇到空字符就会自动停止。
----------------解决方案--------------------------------------------------------
学到不少。
----------------解决方案--------------------------------------------------------
谢谢大家!!!
----------------解决方案--------------------------------------------------------