【发布时间】:2018-06-14 09:30:11
【问题描述】:
我想更好地了解如何使用fgets() 和stdin。
以下是我的代码:
int main()
{
char inputBuff[6];
while(fgets(inputBuff, 6, stdin))
{
printf("%s", inputBuff);
}
return 0;
}
假设我的输入是 aaaabbbb,然后按 Enter。通过使用循环计数,我知道实际上循环将在下一次输入之前运行两次(包括我输入的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() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer. A '\0' is stored after the last character in the buffer. -
您是否期望
"bbb\n"被丢弃,并要求新的输入?如果是这样,程序如何在事先不知道长度的情况下读取一行? -
你到底是什么意思 "我只是想知道为什么我不能使用键盘在循环 2 中输入任何内容,而 fgets() 只是继续从标准输入流中检索 5 个字符...... "?您是想在前一个字符串的中间插入一些东西(
bbb\n之前),还是让fgets读到换行符之后,还是什么? -
对不起,我有一些编码任务要做,所以我无法立即回复您的 cmets。抱歉这么晚才回复。 @n.m。不,我没有收到任何意外的输出。只是想知道为什么“有时”在调用 fgets() 时不要求我输入某事。