【问题标题】:fgets adds \0 or \n at the end of the input?fgets 在输入末尾添加 \0 或 \n 吗?
【发布时间】:2014-10-13 11:37:35
【问题描述】:

我对 fgets 有一些疑问。据我所知,它在字符串末尾添加“\n”,而不是“\0”。所以如果我写这段代码:

fgets(buff,2,stdin);
printf("%s",buff);

所以 fgets 读取两个字符,我输入“y”,所以 buff 应该是“y\n”。我希望 printf 打印 y 并添加一行,而它打印“y”而不添加一行。你能解释一下原因吗?

【问题讨论】:

  • 它在字符串末尾添加“\0”,而不是“\n”。
  • 你检查了fgets doc 看它说什么了吗?
  • 您必须按 ENTER('\n')才能退出 fgets()。在您的具体情况下,buff[0] == 'y'buff[1] == 0'\n' 仍在键盘缓冲区中等待。
  • @pmg 好吧,更准确地说,您需要按 Enter 将您输入的文本发送到 stdin (如果您处于行缓冲模式,因为您通常处于控制台应用程序)。 fgets 本身将在不等待 Enter 的情况下返回完整的缓冲区,由于外部原因,如果用户不按 Enter(通常),它就无法获得完整的缓冲区。

标签: c fgets


【解决方案1】:
char * fgets ( char * str, int num, FILE * stream );

从输入流中读取字符并将它们作为 C 字符串存储到 str 中,直到读取 (num-1) 个字符或到达换行符或文件结尾,以先发生者为准。

换行符使 fgets 停止读取,但它被函数视为有效字符并包含在复制到 str 的字符串中。

在复制到 str 的字符之后会自动附加一个终止空字符 ('\0')。

【讨论】:

  • 非常感谢。现在我有另一个问题,如果“int num”是“2”,我输入一个字符,例如“y”,然后我又做了一个 fgets,第二个不起作用。这是因为内存已经缓冲了“\n”吗?
  • 你可以在下一个 fgets 从 stdin 之前做一个刷新(stdout)
  • @DebasishJana:从stdin 读取时为什么要刷新stdout
  • @alk A fflush(stdout); 确保显示同步。 printf("%s",buff); 可能无法按预期打印。
【解决方案2】:

必须终止字符串,所以是的,它总是在末尾添加'\0'。但是,fgets 可能不会总是添加换行符,如果它不合适的话。我推荐this reference page for fgets

【讨论】:

    【解决方案3】:

    根据手册页明确给出:

     char *fgets(char *s, int size, FILE *stream);
    

    fgets() 从流中最多读入一个小于 size 的字符 和 将它们存储到 s 指向的缓冲区中。阅读停止后 EOF 或换行符。如果读取了换行符,则将其存储到缓冲区中。 '\0' 存储在缓冲区中的最后一个字符之后。

    【讨论】:

      猜你喜欢
      • 2016-04-05
      • 1970-01-01
      • 2018-12-22
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      • 2018-08-09
      相关资源
      最近更新 更多