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;
}