您的位置:首页 > 其它

scanf读输入缓存引发的问题

2011-10-10 07:21 211 查看
在一个程序中发现了这个问题

#include<stdio.h>

int main() {

char a[4];

while(scanf(" %c%c%c%c\n",&a[0],&a[1],&a[2],&a[3]) == 4) {

printf("%c%c%c%c\n",a[3],a[2],a[1],a[0]);

}

return 0;

}

该程序实现包含4个字符的字符串的倒置

可是,该程序只是第一次运行正常

为什么会这样呢?

想了半天,原来是当你第一次输入四个字符并按下Enter键之后,由于scanf函数读取的是缓存区的数据

所以当打印出字符串中的元素之后,你输入的'\n'被当成了下一次输入的a[0],因此只有第一次运行正确

怎样改进呢?

1.在VC下,可以使用fflush(stdin)函数用来清空缓存区的数据。然而,C和C++的标准里从来没有定义过 fflush(stdin)。

因此在GCC下运行会报错

2.把第一次的输入作为特殊情况,第二次及以后的输入进行这样的处理

//第一次的输入

if((scanf("%c%c%c%c",&a[0],&a[1],&a[2],&a[3]) == 4) {

printf("%c%c%c%c\n",a[3],a[2],a[1],a[0]);

}

//第二次及以后的输入,注意输入时的空格

while(scanf("空格%c%c%c%c",&a[0],&a[1],&a[2],&a[3]) == 4) {

printf("%c%c%c%c\n",a[3],a[2],a[1],a[0]);

}

这样处理之后会将上次输入的'\n'与该空格符对应

3.在每次输出之后,调用getchar()函数,"吃掉" '\n'

while(scanf("%c%c%c%c",&a[0],&a[1],&a[2],&a[3]) == 4) {

printf("%c%c%c%c\n",a[3],a[2],a[1],a[0]);

getchar();

}

4.当输入的是字符串时,使用scanf要注意,字符串不能带有空格,因为scanf读到空格就会跳出。此时可使用gets()函数;

读取字符时:

scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中);

getchar()以Enter结束输入,也不会舍弃最后的回车符;

读取字符串时:

scanf()以Space、Enter、Tab结束一次输入

gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: