scanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF。但是如果是数组的话,返回数组的个数。

空白符

空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。如果空白符是一开始就输入,直接略去,读取空白符后的字符,如果空白符在字符后加入,则读取结束。
那么就随之带来一个问题,如何读取类似i love you 之类的字符串。
首先,申明一个问题。
#include <stdio.h>
int main()
{ char a[5];
char str1[10];
int i=scanf("%2s",a);
puts(a);
scanf("%s", str1); /*,是对stdin流再扫描 */

 

printf("%s\n", str1);
return 0;
}

类似这种代码,如果输入超过2关于scanf的若干思考_scanf。发现“bug”这个残留信息还在stdin中.这样就类似于输入 i love you 的字符串,空格后的字符仍然还在stdin中。(经测试)

 

其次。虽然空格、制表符和新行符都用做域分割符号,但读单字符操作中却按一般字符处理。例如,对输入流 "x y" 调用:

scanf( "%c%c%c", &a, &b, &c );
返回后,x 在变量 a 中,空格在变量 b 中,y 在变量 c 中。
注意,控制串中的其它字符,包括空格、制表符和新行符,都用于从输入流中匹配并放弃字符,被匹配的字符都放弃。例如,给定输入流 "10t20",调用:
scanf( "%dt%d", &x, &y );
将把 10 和 20 分别放到 x 和 y 中,t 被放弃,因为 t 在控制串中。
当然,:残留的信息 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;
}
键盘缓冲区残余信息问题
#include <stdio.h>
int main()
{
int a;
char c;
do
{
scanf("%d", &a);
scanf("%c", &c);
printf("a = %d c = %d\n", a, c);
} while(c != 'a');
return 0;
}
scanf("%c", &c);这句不能正常接收字符,什么原因呢?我们用printf("c = %d\n", c);将C用int表示出来,启用printf("c = %d\n", c);这一句,看看scanf()函数赋给C到底是什么,结果是c=10 ,ASCII值为10是什么?换行即\n.对了,我们每击打一下"Enter"键,向键盘缓冲区发去一个“回车”(\r),一个“换行"(\n),在这里\r被scanf()函数处理掉了(姑且这么认为吧^_^),而\n被scanf()函数“错误”地赋给了c.解决办法:可以在两个scanf()函数之后加个fflush(stdin);