c语言输入缓冲区数据清空

遇到的问题

最近做实验写代码经常会遇见这个问题:前面的键盘输入可能会影响到后续的输入,即前面的未被读取到的输入会在缓冲区中作为后面语句的输入,即程序不再等待用户输入,在进行输入格式错误判断时会连续出现多个输入错误警告语句;此处读取的是字符所以为有限个警告语句,若读取整型数而输入为字符则可能导致全面屏的警告语句

解决方法

清空缓冲区
使用一个字符变量存储多余的输入(将缓冲区的变量取出);
scanf的返回值小于1时,用getchar获取缓冲区的字符

while ((c = getchar()) != EOF && c != '\n');

分析

此处备注scanf的相关事项:
scanf的读入方式:
假设scanf()根据一个%d转换说明读取一个整数。scanf()每次读取一个字符,跳过所有的空白字符,直至遇到第一个非空白字符才开始读取。因为要读取整数,所以scanf()希望发现一个数字字符或者一个符号(+或-)。 如果找到一个数字或符号,它便保存该字符,并读取下一个字符。如果下一个字符是数字,它便保存该数字并读取下一个字符。
scanf()不断地读取和保存字符,直至遇到非数字字符
如果遇到一个非数字字符,它便认为读到了整数的末尾。然后,scanf()把非数字字符放回输入。这意味着程序在下一次读取输入时,首先读到的是上一次读取丢弃的非数字字符。最后,scanf()计算已读取数字(可能还有符号)相应的数值,并将计算后的值放入指定的变量中。

即若希望scanf读取一个int型数据,而输入为char型,则程序由于每次都不能读入成功,则每次从a开始读取,不需等待用户输入,一直循环下去。

scanf的返回值:函数scanf返回的是该函数成功读入的变量的个数,读到文件结尾时返回-1(EOF)。
eg.scanf(“%d%d",&a,&b);
当输入为1 2 时,返回值为2;
当输入为1 a时,返回值为1;
当输入为a 2时,返回值为0;
当输入为^ z时,返回值为-1.

输入缓冲区:用户输入的字符在按下enter键之前都被存储在缓冲区,按下enter键后程序才可使用用户输入字符,字符从缓冲区中被取出。

猜你喜欢

转载自blog.csdn.net/ZZZZ_Y_/article/details/121448730