fflush(标准DIN)ANSI C

fflush(标准DIN)ANSI C,c,fflush,C,Fflush,我是一个ANSI C的初学者,我有一个问题,这可能是一个愚蠢的问题,我很抱歉 #include<stdio.h> main() { int age; printf("Hello World!\n"); printf("Please enter your age: "); scanf("%d", &age); printf("You entered %d\n",

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

#include<stdio.h>
    main()
    {
          int age;
          printf("Hello World!\n");
          printf("Please enter your age: ");
          scanf("%d", &age);
          printf("You entered %d\n", age);
          fflush(stdin);
          getchar();
    }
#包括
main()
{
智力年龄;
printf(“你好,世界!\n”);
printf(“请输入您的年龄:”;
scanf(“%d”和年龄);
printf(“您输入了%d\n”,年龄);
fflush(stdin);
getchar();
}
这是我学习scanf函数的第二个程序。 我的问题是:
我知道printfscanffflushstdingetchar都是在stdio.h中定义的,但只有当我使用fflush(stdin)时,我必须将包括在内,但是当使用任何其他方法时,我可以删除该行#include。

您可能需要该头文件,因此将定义
stdin
。如果关闭了编译器警告,编译器将不会让您知道未定义的函数。(如果他们真的是 未定义,稍后将出现链接器错误)
stdin
FILE*
类型的变量,不是函数

请不要调用
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\u-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;
}
int flush_in(文件*FILE)
{
int-ch;
国际旗帜;
int-fd;
fd=文件号(文件);
标志=fcntl(fd,F_GETFL,0);
如果(标志<0){
返回-1;
}
if(fcntl(fd、F|U SETFL、标志| O|U非块)){
返回-1;
}
做{
ch=fgetc(文件);
}while(ch!=EOF);
clearerr(文件);
if(fcntl(fd、F_设置、标志)){
返回-1;
}
返回0;
}
然后调用
flush\u in(stdin)

调用该头中声明的任何函数时,必须具有
\include

好吧,那不完全是真的。在1989/1990版本的语言标准中,调用可以创建函数的隐式声明。如果这恰好与正确的声明相匹配,您可以不受惩罚;。否则,您的程序的行为是未定义的——这意味着您仍然可能会侥幸逃脱,也可能不会,但编译器不需要就此向您发出警告。由于
printf
接受数量可变的参数,因此必须有一个可见声明以避免未定义的行为,而获取可见声明的方法是
#include

(您也可以自己声明函数,但这很容易出错,没有理由这么做。)

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

main()
应该是
intmain(void)


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

是否已包含任何其他头文件?不,这是代码。我不明白bothIt的区别是什么,值得注意的是,
fflush(stdin)
虽然在一些实现中可以工作,但它仍然是未定义的行为。根据该标准,
fflush
仅适用于输出/更新流。请注意,在某些系统(尤其是带有Microsoft库的Windows)上,
fflush(stdin)
是定义的行为。在许多系统上,根据C和POSIX标准,这是未定义的行为。另请参阅。让战斗开始:@JonathonReinhart这不是一场战斗,
fflush(stdin)
不仅不可移植,而且在任何非行缓冲输入上都不具备正确操作的能力。哈哈,我喜欢发布这条评论为我的回答赢得了-2分。我太傻了,嗯。那就-3吧
fflush(stdin)
不会做你认为它会做的事情,一个错误的、作者没有修正的公认答案应该有很高的负分,以提醒读者它是错误的。请注意,即使是C89/90在使用之前也需要声明任何可变函数,如
printf()
。当然,您可以(仍然可以)编写
extern int printf(const char*fmt,…)在使用它之前,这将达到目标。然而,包含标题要明智得多。@JonathanLeffler:但它没有强制执行这一要求。正如我所说的,在C90中调用
printf
而没有一个可见的声明具有未定义的行为——但它很可能“起作用”。是的,这是未定义的行为。我也许应该说我的意思是“C89/90标准”,而不是“C89/90实现”,但我在回答中提到的声明已经有了相应的限定。这只是一个小脚注,不是一个大问题。