我对fgets有一些疑问。据我所知,它会在字符串末尾添加"\n"而不是"\0"。因此,如果我写下这段代码:
fgets(buff,2,stdin);
printf("%s",buff);
fgets函数读取两个字符,如果我输入"y",那么缓冲区应该是"y\n"。我期望printf函数输出"y"并且换行,但实际上它只输出了"y"而没有换行。您能解释一下为什么吗?
char * fgets ( char * str, int num, FILE * stream );
从输入流中读取字符,并将它们存储为 C 字符串到 str 中,直到读取了 (num-1) 个字符或者遇到换行符或文件结束符(以先发生者为准)。
遇到换行符时,fgets 停止读取,但它被视为函数的有效字符,并包含在复制到 str 的字符串中。
复制到 str 中的字符后会自动添加一个终止空字符 ('\0')。
fflush(stdout);
可以确保在显示器上同步。当使用 printf("%s",buff);
时,可能不会按预期打印。 - chux - Reinstate Monica char *fgets(char *s, int size, FILE *stream);
fgets()函数从流中最多读取size-1个字符并将它们存储到指向s的缓冲区中。当遇到EOF或换行符时,读取停止。如果读取到换行符,则将其存储到缓冲区中。在缓冲区的最后一个字符之后存储'\0'。
fgets()函数会在字符串末尾添加\0,但如果文件中存在\n,则读取该字符串时也会包含\n。
读取字符串后,我得到了这样的结果:"guitar\n\0\U00000004\xd5..."
我的文件中有一个单词"guitar"和一个\n,所以你可以看到它读取了带有"\n"的单词,并将"\0"添加到了字符串中。
'\n'
)才能从fgets()
中退出。在你的特定情况下,buff[0] == 'y'
和buff[1] == 0
。'\n'
仍然在键盘缓冲区中等待。 - pmgfgets
本身会在不等待Enter的情况下返回完整的缓冲区,但由于外部原因而无法获取该完整的缓冲区,除非用户按下Enter(通常情况下)。 - hyde