scanf缓冲区
在学习scanf之前,先来了解以下“缓冲区”这个概念。
我们从键盘输入的都是字符,scanf中的“%d”会将从键盘中输入的字符转换为整型,其它类型亦如此。当我们从键盘输入时,数据会先存入缓冲区。但是!当我们输入一个整型数字时,会用回车来结束,那么回车这个按键也会留在缓冲区,对应的时 ‘\n’ 。了解这一点,然后我们来看一个栗子。
#include <stdio.h>
#include <stdlib.h>
int main() {
int m;
char c;
scanf("%d", &m);
printf("m=%d\n", m);
scanf("%c", &c);//读取的是\n,所以不会阻塞
printf("c=%c\n", c);
system("pause");
}
当我们输入10的时候,会按一个回车,此时缓冲区就会有一个 ‘\n’,然后 scanf("%c", &c); 这条语句就会读取缓冲区 ‘\n’,将换行输出,所以最终结果有两个换行。 那么如何先输入一个整型,然后再输入一个字符型呢?只需要对缓冲区进行刷新就可以了!!!
printf("m=%d\n", m);
fflush(stdin);//清空缓存区
scanf("%c\n", &c);
下面来看一个循环输入的栗子。自行研究。
#include <stdio.h>
#include <stdlib.h>
int main() {
int m;
char c;
while(fflush(stdin),(scanf("%d",&m)!=EOF)) //EOF==-1
{
printf("%d\n",m);
}
system("pause");
}
当没有fflush(stdin)时,第一次有输入时会判断为1 !=EOF,进入循环,当输入字符型时,判断为0,同样也不等于-1,所以会一直循环。因而前面加上了fflush(stdin),防止输错。