【问题标题】:fgets doesn't wait for stdin [duplicate]fgets 不等待标准输入 [重复]
【发布时间】:2017-07-07 06:55:03
【问题描述】:

我正在尝试从fgets() 读取输入,并且该函数不等待输出(从键盘)。我们被告知使用fgets,所以scanf 不是这里的选项。 fgets 函数确实在出于某种原因在 main 函数中使用时起作用,但在附加函数中不起作用。

这是代码

char name[21]={0x0}; //tried everything; not assigning value and NULL&\0

    printf("\nName: ");

    //fseek(stdin,0,SEEK_END);
    //rewind(stdin);
    //fflush(stdin);      //these don't help
    printf(stdin);        //for testing purposes, probably pointless
    fgets(nimi, 21, stdin);

程序将跳过fgets() 并且不等待输入,然后在我想要名称字符串的地方添加一些空字符串。但是,name 没有得到 NULL 值,因为存在错误检查。我知道有很多人有这个问题,但我没有找到任何帮助。大多数人告诉使用scanf 或其他一些功能。作为记录,scanf() 将在此处按预期工作。语法应该是正确的,因为它适用于main()。我可能什至不知道stdin 的实际工作原理,所以如果标题很愚蠢,我深表歉意。

这个sn-p直接在malloc for指针之后(if else子句)

【问题讨论】:

  • 出于测试目的,可能毫无意义....不,这是完全错误的....
  • 您是否在此代码之前使用scanf()? (可能是这个问题)除了printf(stdin); 有问题。
  • stdin 通常是不可搜索的,所以 fseek()rewind() 永远不应该用在它上面。 fflush() 用于刷新输出,而不是丢弃不需要的输入;如果像典型的那样,stdin 未打开以供写入,则 fflush() 调用将失败并出现错误(您忽略该错误)。即使它可以写入,刷新输出端也无法达到您的目的。简而言之,也不要fflush(stdin)
  • 您的 sn-p 不足以解释您描述的行为。构建一个 minimal reproducible example 来演示问题,如果该练习不能帮助您自己发现问题,请将其编辑到您的问题中。
  • scanf() 的输入缓冲区中可能仍有换行符。

标签: c input keyboard


【解决方案1】:

人们指出我的输入缓冲区中有一些东西,这是正确的。当我包含时,我的程序现在可以工作了

 while ((int ch = getchar()) != '\n' && ch != EOF);

在我的 fgets() 之前的代码中。在此之前实际上有 scanf 函数。我永远感谢那些回答的人!对不起,如果我用代码让自己看起来像个白痴。这是我的第一个 C 程序之一,因此代码可能“有点”偏离。再次感谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多