首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >(标准) ANSI C

(标准) ANSI C
EN

Stack Overflow用户
提问于 2012-07-22 22:43:05
回答 2查看 19.5K关注 0票数 2

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

代码语言:javascript
运行
复制
#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 111stdio.h< fflush(stdin) >E 212/code>中定义了printfscanffflushstdingetchar,但只有当我使用时,我才必须放置#include<stdio.h>,,但是当使用任何其他方法时,我可以删除该行#include。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-22 22:54:58

在调用标头中声明的任何函数时,必须具有#include <stdio.h>

好吧,那不完全是真的。在1989/1990年版本的语言标准中,调用可以创建函数的隐式声明。如果这恰好与正确的声明相匹配,则可以不受限制;否则,您的程序的行为是未定义的--这意味着您仍然可以逃脱它,或者没有,但是编译器不需要对此发出警告。由于printf使用可变数量的参数,您必须有一个可见的声明以避免未定义的行为--获得可见声明的方法是#include <stdio.h>

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

在C99和更高版本中,不存在隐式声明。

main()应该是int main(void)

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

票数 9
EN

Stack Overflow用户

发布于 2012-07-22 22:46:49

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

请不要打给fflush(stdin)。它有不明确的行为。如果需要清除输入缓冲区,请使用另一种方法。这样做的标准方法是尝试读取数据,直到下一行结束:

代码语言:javascript
运行
复制
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),您可以暂时使文件描述符非阻塞,并从其中读取所有输入:

代码语言:javascript
运行
复制
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)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11604575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档