我是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();
}
这是我的第二个程序,学习扫描功能。我的问题是:我知道在E 111
stdio.h< fflush(stdin) >E 212/code>中定义了printf、scanf、fflush、stdin和getchar,但只有当我使用时,我才必须放置#include<stdio.h>,,但是当使用任何其他方法时,我可以删除该行#include。
发布于 2012-07-22 22:54:58
在调用标头中声明的任何函数时,必须具有#include <stdio.h>
。
好吧,那不完全是真的。在1989/1990年版本的语言标准中,调用可以创建函数的隐式声明。如果这恰好与正确的声明相匹配,则可以不受限制;否则,您的程序的行为是未定义的--这意味着您仍然可以逃脱它,或者没有,但是编译器不需要对此发出警告。由于printf
使用可变数量的参数,您必须有一个可见的声明以避免未定义的行为--获得可见声明的方法是#include <stdio.h>
。
(您也可以自己声明函数,但这很容易出错,而且没有充分的理由这样做。)
在C99和更高版本中,不存在隐式声明。
main()
应该是int main(void)
。
fflush(stdin)
有未定义的行为。如果要丢弃在scanf()
调用后输入的字符,则可以读取和丢弃这些字符。
发布于 2012-07-22 22:46:49
您可能需要该头文件,以便定义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_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)
。
https://stackoverflow.com/questions/11604575
复制相似问题