1、fflush() 的标准用法
根据C语言标准,fflush()
函数的语法如下,
int fflush(FILE *stream);
stream
是指向 FILE
对象的指针,通常是 stdout
、stderr
或文件指针。fflush()
刷新指定流的缓冲区内容。对输出流来说,它会将缓冲区中的数据实际写入文件或设备。
2、fflush(stdin) 是未定义行为
根据C语言标准(C99及之后),fflush()
只能用于输出流(如 stdout
),而不能用于输入流(如 stdin
)。使用 fflush(stdin)
是未定义行为,也就是编译器和运行环境可以自由地决定如何处理 fflush(stdin)
,而结果可能因平台而异。
3、fflush(stdin) 会被使用的原因
在某些特定的平台(如一些旧版的Windows编译器),fflush
(stdin) 被用作清除标准输入缓冲区的非标准方法。然而,这种用法并不是所有编译器都支持的,因此在跨平台编程时会产生不兼容问题。
4、清除 stdin 缓冲区推荐方法
为了跨平台地清除 stdin
缓冲区,可以使用以下几种推荐方法。
1)使用 getchar() 清空缓冲区
getchar()
逐个读取缓冲区中的字符,直到遇到换行符 \n
或文件结束符 EOF
。如此可以确保清除 stdin
中残留的输入数据。
#include <stdio.h>
int main() {
int c;
printf("Enter a character: ");
char ch = getchar();
// 清空缓冲区中剩余的字符,直到遇到换行符或 EOF
while ((c = getchar()) != '\n' && c != EOF) {
// 空循环体,用于丢弃输入缓冲区中的字符
}
printf("You entered: %c\n", ch);
return 0;
}
2)使用 scanf() 清空缓冲区
在格式字符串 " %c"
中使用前导空格,scanf()
会跳过所有空白字符(如空格和换行符),直到遇到一个非空白字符。这种方法仅适用于需要读取一个字符的情况。
#include <stdio.h>
int main() {
char ch;
printf("Enter a character: ");
scanf(" %c", &ch); // 注意前面的空格,它可以跳过所有空白字符,包括换行符
printf("You entered: %c\n", ch);
return 0;
}
5、fflush(stdin) 替代方法使用示例
在处理用户输入时,需要在用户输入数字之后清除缓冲区中的其他字符,可以使用 getchar()
来替代 fflush(stdin)。
#include <stdio.h>
int main() {
int num;
printf("Enter a number: ");
if (scanf("%d", &num) != 1) {
printf("Invalid input.\n");
}
// 清空输入缓冲区中剩余的字符
int ch;
while ((ch = getchar()) != '\n' && ch != EOF) {
// 丢弃剩余的输入字符
}
printf("You entered: %d\n", num);
return 0;
}