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结束输入(空格不结束),接受空格,会舍弃最后的回车符!
#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结束输入(空格不结束),接受空格,会舍弃最后的回车符!
相关文章推荐
- 一个字符变量存储到动态分配内存引发的输入问题解决--连续输入scanf函数存在缓冲区的问题
- scanf()函数连续输入数字,字符引发的小问题
- 由scanf("%d",&ch);引出的输入缓冲区问题
- LoadRunner缓存设置引发的问题
- 由scanf("%d",&ch);引出的输入缓冲区问题
- 在linux系统下编程,解决scanf不能输入空格的问题
- 关于刷新输入缓存的问题
- scanf输入字符和数字的问题
- WinForm:一个登陆窗体引发的问题系列(二):用户名文本框的输入限制
- 关于scanf格式化输入函数的小问题
- 用户输入到缓存区清空的问题
- C语言scanf函数输入时键盘缓冲区\n的问题[经典问题]
- c语言中scanf输入带空格的字符串以及scanf输入单个字符的问题
- 用户输入的多次提交引发问题
- 标准输入缓冲给scanf()带来的问题
- 【缓存区问题】深入了解scanf()/getchar()和gets()/cin等函数
- Linux C编程 使用scanf时清除键盘缓冲区 -- 清除输入缓存
- 缓存缺失一段代码引发的问题
- 网络缓存大小引发的问题
- Android Studio更改Gradle缓存目录所引发的各种奇葩问题