gpt4 book ai didi

c - 关于fgets()和stdin一起使用的机制

转载 作者:行者123 更新时间:2023-12-01 13:19:37 25 4
gpt4 key购买 nike

我想更好地了解使用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() 的手册页中不管你在问什么。只需要正确阅读它,它说

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

fgets() reads in at most one less than sizecharacters 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 terminating null byte (aq\0aq) is stored after the last character in the buffer.



如果输入是 aaaabbbb并在 fgets()您将大小指定为 6 的第二个参数即它会少读一个 5字符和终止 \0将第一时间添加 inputBuff持有 aaaab并且因为仍然 EOF\n下次没发生过 inputBuff持有 bbb\n因为新行也最后被存储。

您还应该检查 fgets() 的返回类型并检查是否 \n发生然后中断循环。例如
char *ptr = NULL;

while( (ptr = fgets(inputBuff, 6, stdin))!= NULL){
if(*ptr == '\n')
break;
printf("%s", inputBuff);
}

关于c - 关于fgets()和stdin一起使用的机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50854127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com