1、使用 fflush(stdin)(不推荐)
虽然 fflush
通常用于刷新输出流,但有些编译器可以 fflush(stdin)
清空输入缓冲区。然而,这种做法并不是 C 标准的一部分,因此它并不是移植性强的解决方案。
#include <stdio.h> int main() { int num; printf("请输入一个整数:"); scanf("%d", &num); // 清空输入缓冲区 fflush(stdin); // 不推荐使用 printf("输入的数字是:%d\n", num); return 0; }
2、 使用 getchar() 或 while 循环清空缓冲区
更常见且标准的方法是使用 getchar()
来读取并丢弃缓冲区中的所有字符,直到遇到换行符或文件结束标志(EOF
)。这样可以确保清空缓冲区中多余的字符。
#include <stdio.h> int main() { int num; printf("请输入一个整数:"); scanf("%d", &num); // 清空缓冲区 while (getchar() != '\n'); // 丢弃直到换行符为止 printf("输入的数字是:%d\n", num); return 0; }
3、使用 scanf 忽略换行符
如只需要在每次输入后清除换行符,也可以使用 scanf
的格式控制来直接跳过换行符。
#include <stdio.h> int main() { int num; printf("请输入一个整数:"); scanf("%d", &num); // 使用 scanf 跳过换行符 scanf("%*c"); // 忽略一个字符(通常是换行符) printf("输入的数字是:%d\n", num); return 0; }
4、 使用 fgets() 读取一整行
fgets()
函数可以用来读取一整行输入,包含换行符 \n
,并且它会阻塞直到输入完成。这种方法可以有效地清空缓冲区,特别是在输入数据后需要丢弃剩余数据时。
#include <stdio.h> int main() { int num; printf("请输入一个整数:"); scanf("%d", &num); // 使用 fgets 清空缓冲区 char ch; while ((ch = getchar()) != '\n' && ch != EOF); // 读取并丢弃直到换行符 printf("输入的数字是:%d\n", num); return 0; }
5、 setbuf() 或 setvbuf() 设置缓冲区
setbuf()
和 setvbuf()
用于控制文件流的缓冲方式,但它们通常并不是用来清空标准输入缓冲区的。不过在一些特殊场景下,这些函数可以帮助减少不必要的缓冲,进而减少输入问题。
#include <stdio.h> int main() { int num; setbuf(stdin, NULL); // 禁用标准输入流的缓冲(直接从终端读取输入) printf("请输入一个整数:"); scanf("%d", &num); printf("输入的数字是:%d\n", num); return 0; }