我希望能更好地理解如何使用
假设我的输入是
第1次循环:在我输入字符后,
第2次循环:由于
第3次循环:程序将要求我输入(第二次),因为文件流已到达结尾(
问题:似乎
fgets()
和 stdin
。以下是我的代码:int main()
{
char inputBuff[6];
while(fgets(inputBuff, 6, stdin))
{
printf("%s", inputBuff);
}
return 0;
}
假设我的输入是
aaaabbbb
,我按下回车键。通过使用循环计数器,我知道在下一次输入之前实际上循环将运行两次(包括我输入的aaaabbbb
)。第1次循环:在我输入字符后,
aaaabbbb\n
将被存储在stdin
文件流的缓冲区中。然后,fgets()
将从文件流中检索特定数量的数据并将它们放入inputBuff
中。在这种情况下,它将每次检索5个(6-1)个字符。因此,当fgets()
已经运行一次时,inputBuff
将存储aaaab
,然后被打印出来。第2次循环:由于
bbb\n
仍然留在文件流中,fgets()
将执行第二次,以便inputBuff
包含bbb\n
,然后被打印出来。第3次循环:程序将要求我输入(第二次),因为文件流已到达结尾(
EOF
)。问题:似乎
fgets()
只会在stdin
流中没有剩余数据(EOF
)时才要求我输入。我只是想知道为什么我不能在第2次循环中使用键盘输入任何内容,fgets()
继续从stdin
流中检索5个字符,并将多余的数据留在文件流中以供下一次检索。我是否对stdin
或fgets()
有任何误解?谢谢你的时间!
fgets()函数从流中最多读取size-1个字符,并将它们存储到指向s的缓冲区中。当遇到EOF或换行符时,读取停止。如果读取到换行符,则将其存储到缓冲区中。在缓冲区中的最后一个字符后面存储'\0'。
- joop"bbb\n"
被丢弃,然后请求新的输入?如果是这样,那么一个程序如何在未知长度的情况下读取一行呢? - Weather Vanefgets
会一直读取到行末或者缓冲区已满。第一次调用停止是因为缓冲区已满。第二次调用停止是因为到达了行末。如果fgets
等待更多的输入,它可以读取 两行,但它并没有这样做。它只读取一行。它不需要更多的输入,因为它已经有足够的输入了。 - Weather Vane