空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。如果空白符是一开始就输入,直接略去,读取空白符后的字符,如果空白符在字符后加入,则读取结束。
#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。发现“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);