#include <stdio.h>
int main()
{
char str[80];
scanf("%s",str);
printf("%s",str);
return 0;
}
输入:I love you!
上述程序并不能达到预期目的,scanf()扫描到"I"后面的空格就认为对str的赋值结束,并忽略后面的"love you!".这里要注意是"love you!"还在键盘缓冲区(关于这个问题,网上我所见的说法都是如此,但是,我经过调试发现,其实这时缓冲区字符串首尾指针已经相等了,也就是说缓冲区清空了,scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中)。我们改动一下上面的程序来验证一下:
#include <stdio.h>
#include<windows.h>
int main()
{
char str[80], str1[80], str2[80];
scanf("%s", str); /* 此处输入:I love you! */
printf("%s\n", str);
Sleep(5000); /* 这里等待5秒,告诉你程序运行到什么地方 */
/* 不是sleep(5)
1,函数名是Sleep不是sleep。
2,C/C++中,unsigned Sleep(unsigned)应该是毫秒ms.
*/
scanf("%s", str1); /* 这两句无需你再输入,是对stdin流再扫描 */
scanf("%s", str2); /* 这两句无需你再输入,是对stdin流再扫描 */
printf("%s\n", str1);
printf("%s\n", str2);
return 0;
}
输入:I love you!
输出:
I
love
you!
好了,原因知道了,所以结论是:残留的信息 love you是存在于stdin流中,而不是在键盘缓冲区中。那么scanf()函数能不能完成这个任务?回答是:能!别忘了scanf()函数还有一个 %[] 格式控制符(如果对%[]不了解的请查看本文的上篇),请看下面的程序:
#include <stdio.h>
int main()
{
char str[50];
scanf("%49[^\n]", str); /* scanf("%s",string); 不能接收空格符 */
printf("%s\n", str);
return 0;
}