
fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准
输出设备
上。
2、scanf()函数接收
输入数据
时,遇以下情况结束一个数据的输入:(不是结束该
scanf函数
,scanf函数仅在每一个数据域均有数据,并按回车后结束)。
①
遇空格、“回车”、“跳格”键。
②
遇宽度结束。
③
遇非法输入。
键盘缓冲区就可能有残余信息问题。
scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中
解决就要在scanf()函数之后加个fflush(stdin)。
while(getchar()!='n') -- 应当是 while(getchar()!='\n') 这是不断循环取字符,直到取到 Enter 键时结束循环。作用,清除上面一次输入时残留在输入流中的字符。改用 fflush(stdin)更佳。
ret = scanf("%d,%d",&a,&b) ret 为成功读得的数据个数。
清除的缓冲区中的残留数据: if (ret != 2) fflush(stdin)
scanf("%*[^\n]")^取反或者“非”,[^\n]就是除了回车什么都可以被scanf读到。*表示被读到了但是不把读到值或者字符赋值给任何变量。
%*[^\n]就是读取来自键盘的出去回车外的任意字符,并不赋值给变量。
scanf("%*c")
就一个*,和上边表示一样就是读到了不赋值给任何变量。
再看,scanf("%[^\n]%*c",str)读入一行字符,赋值给str变量。如果c前面没有*,那么就需要str后面再写一个char类型的ch。这就告诉你*表示读到了但是不赋值给任何变量。
那么scanf("%*[^\n]%*c")这句话,应该能理解吧,两个格式控制符里面都有*,就是都读到了都不赋值变量。
读到这里你应该差不多理解了,就是你的题中的两句scanf(相当于scanf("%*[^\n]%*c"))读到了你输入的abc,但是没有赋值给任何变量。然后到了gets(str4)读到了def赋值给str4,然后printf("%s\n", str4)后必然显示def。
清空缓存区用fflush(stdin)这句代码。
键盘输入的东西都是放在缓冲区的这款区域,有变量过来了就带走,没有变量就在那里呆着等待一个变量来带它走。但是这个时候缓冲区里面偶尔会有一些垃圾的字符,而影响了正常的输入,有的时候用getchar()带走一个两个的字符,但是如果还是不见效一句fflush(stdin)就可以了。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)