fgets函数会在输入的末尾添加\0或\n吗?

3

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

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

fgets函数读取两个字符,如果我输入"y",那么缓冲区应该是"y\n"。我期望printf函数输出"y"并且换行,但实际上它只输出了"y"而没有换行。您能解释一下为什么吗?


它在字符串末尾添加"\0"而不是"\n"。 - BLUEPIXY
1
你有查看fgets文档吗? - P.P
2
你必须按下 ENTER 键('\n')才能从 fgets()退出。在你的特定情况下,buff[0] == 'y'buff[1] == 0'\n' 仍然在键盘缓冲区中等待。 - pmg
@pmg,更准确地说,您需要按Enter键将您输入的文本发送到stdin(如果您处于行缓冲模式下,通常在控制台应用程序中)。 fgets 本身会在不等待Enter的情况下返回完整的缓冲区,但由于外部原因而无法获取该完整的缓冲区,除非用户按下Enter(通常情况下)。 - hyde
4个回答

8
char * fgets ( char * str, int num, FILE * stream );

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

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

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


非常感谢。现在我有另一个问题,如果“int num”是“2”,我输入一个字符例如“y”,然后我再做另一个fgets,第二个就不起作用了。这是因为内存已经缓冲了“\n”吗? - testermaster
在从标准输入流(stdin)获取下一行之前,您可以执行flush(stdout)。 - Dr. Debasish Jana
1
@DebasishJana:为什么在从stdin读取时要刷新stdout? - alk
@alk 一个 fflush(stdout); 可以确保在显示器上同步。当使用 printf("%s",buff); 时,可能不会按预期打印。 - chux - Reinstate Monica

1
根据man页,它清楚地给出了以下内容:
 char *fgets(char *s, int size, FILE *stream);

fgets()函数从流中最多读取size-1个字符并将它们存储到指向s的缓冲区中。当遇到EOF或换行符时,读取停止。如果读取到换行符,则将其存储到缓冲区中。在缓冲区的最后一个字符之后存储'\0'。


1
它必须终止字符串,因此它总是在末尾添加'\0'。但是,如果不适合,fgets可能不会始终添加换行符。我建议参考此页面了解fgets。链接:fgets的参考页面

0

fgets()函数会在字符串末尾添加\0,但如果文件中存在\n,则读取该字符串时也会包含\n。

读取字符串后,我得到了这样的结果:"guitar\n\0\U00000004\xd5..."

我的文件中有一个单词"guitar"和一个\n,所以你可以看到它读取了带有"\n"的单词,并将"\0"添加到了字符串中。


这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Alexander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接