fflush(stdin)ANSI C

我是ANSI C的初学者,我有一个问题,这可能是一个愚蠢的问题,我很抱歉。

#include main() { int age; printf("Hello World!\n"); printf("Please enter your age: "); scanf("%d", &age); printf("You entered %d\n", age); fflush(stdin); getchar(); } 

这是我学习scanffunction的第二个程序。 我的问题是:我知道printfscanffflushstdingetchar是在stdio.h中定义的,但只有当我使用fflush(stdin)时我必须把#include < stdio.h > ,但是当使用任何其他方法时我可以删除该行#include。

当您调用该标头中声明的任何函数时,您必须具有#include

好吧,那不是真的。 在1989/1990版本的语言标准中,调用可以创建函数的隐式声明。 如果这恰好符合正确的声明,你就可以逃脱它; 否则你的程序的行为是未定义的 – 这意味着你仍然可以逃避它,或者没有,但编译器不需要警告你。 由于printf采用可变数量的参数,因此必须具有可见的声明以避免未定义的行为 – 获取可见声明的方式是#include

(你也可以自己声明这个函数,但这很容易出错,并且没有充分的理由去做。)

在C99及更高版本中,没有隐式声明。

main()应该是int main(void)

fflush(stdin)有未定义的行为。 如果要丢弃在scanf()调用后输入的字符,则可以读取并丢弃它们。

您可能需要该头文件,因此将定义stdin 。 如果关闭编译器警告,编译器将不会让您知道未定义的函数。 (如果它们确实未定义,稍后您将收到链接器错误)。 stdinFILE *类型的变量,而不是函数。

请不要调用fflush(stdin) 。 它有不确定的行为。 如果需要清除输入缓冲区,请使用其他方法。 执行此操作的标准方法是尝试读取数据,直到下一行结束:

 int flush_line(FILE *file) { int ch; do { ch = fgetc(file); } while (ch != '\n' && ch != EOF); if (ch == EOF && ferror(file)) { return -1; } return 0; } 

然后你会调用flush_line(stdin)

如果不考虑可移植性(请注意,这不适用于Windows),您可以暂时使文件描述符无阻塞并从中读取所有输入:

 int flush_in(FILE *file) { int ch; int flags; int fd; fd = fileno(file); flags = fcntl(fd, F_GETFL, 0); if (flags < 0) { return -1; } if (fcntl(fd, F_SETFL, flags | O_NONBLOCK)) { return -1; } do { ch = fgetc(file); } while (ch != EOF); clearerr(file); if (fcntl(fd, F_SETFL, flags)) { return -1; } return 0; } 

然后你会调用flush_in(stdin)