scanf()函数最容易出问题的地方就是
格式化读取与缓冲区的问题。
结合代码来看:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include<stdio.h>
int main() { int a=1,b=1; char c='a'; printf("before:\n"); printf("%d,%d,%c\n",a,b,c); //输出初始化状态 scanf("%d%d",&a,&b); //清空缓冲区 //fflush( stdin ); //scanf("%*[^\n]%*c"); scanf("%c",&c);
printf("%d,%d,%c\n",a,b,c); //输出之后的变化 }
|
一开始输出1,1,a这没问题。
scanf()从缓冲区格式化读取东西,如果缓冲区不为空,无需等待用户输入,直接从缓冲区继续读取。
当我输入2 b时,结果如下:
分析:
scanf(“%d%d”,&a,&b);
想要读取两个整型数据,先读取到2符合,存到了a;然后读到空格,忽略;(直接输2b结果一样)。在读取b字符型不是整型,退出scanf()函数,b变量并未被赋值。
**此时,缓冲区中剩余字符b。**
然后执行
scanf(“%c”,&c);
因为缓冲区中有字符b,直接读取b,存到了c变量。
清空缓冲区:
代码中加入下列两个函数之一都可以清空缓冲区。
fflush( stdin );
scanf(“%[^\n]%c”);
输入2b之后,缓冲区被清,第二个scanf()函数等待用户输入。
-------------
Thank you for reading
-------------