首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于scanf缓冲区有关问题

2014-01-19 
关于scanf缓冲区问题char a[100] char bscanf(%s, a)scanf(%c, &b)此时输入一次字符,a获取字

关于scanf缓冲区问题
char a[100] = "";
char b;
scanf("%s", a);
scanf("%c", &b);

此时输入一次字符,a获取字符串,b会获取第一次调用scanf后残留的'\n'

char a[100] = "";
char b[100] = "";
scanf("%s", a);
scanf("%s", b);

此时获取b需要重新输入字符
疑问是:第一次读取a时,残留的'\n'没有被b获取,是直接被忽略了么?
[解决办法]

引用:
疑问是:第一次读取a时,残留的'\n'没有被b获取,是直接被忽略了么?


空格('\n', '\t', ' ')是字符串的分割符,会被%s忽略的。
[解决办法]
直接忽略 
区别在于 %c 会读取 空白字符 而 %s 不会
%d %f %x %i %o 等等都不会读取空白字符 
所以 前面有没有滞留 空白字符无所谓
[解决办法]
"%s"读数据的时候会跳过所有的空格,tab和回车
"%c"则会读入任何字符, 包括空格, tab和回车

顺便说一下, LS说的rewind(stdin)和fflush(stdin)一样, 是一种不可移植的写法, 被微软支持, 但不被gcc支持。
通用的写法是
char ch;
while ( (c = getchar()) != '\n' && c != EOF ) ;
[解决办法]
第二个scanf的时候,除去%c,其他格式说明符都忽略前面的空白(包括空格、回车、制表等),从第一个非空白字符读取。

热点排行