持续循环直到char等于EOF

3
while( (c = fgetc(stdin)) != EOF ){
    count++;
    if (count == lineLen - 1){
        moreChars = (char*) realloc(line, lineLen *=2);

        if(moreChars == NULL){
            puts("Error allocating for moreChars.");
            free(moreChars);
            exit(-69);
        }
        else
            line = moreChars;
    }
    line[count - 1] = c;
}

这是我的代码。我的问题是当用户按(ctrl+d)结束循环时,他们必须输入两次,也就是说,要结束循环,用户必须输入(ctrl+d)(ctrl+d)。
示例输入:
hi there you guy dood (ctrl+d) (ctrl+d)
理想输入:
hi there you guy dood (ctrl+d)
更加明确地说:
我希望用户只需输入一次(ctrl+d)即可结束循环,但不知道为什么用户必须输入(ctrl+d)(ctrl+d)才能结束循环。
谢谢。

我有一段代码,在循环之外将空字符附加到字符串等等。唯一的问题在于我认为是在这个代码片段内部。如果需要,我会提供其他代码。 - slmyers
1
确保 c 是一个 int - William Morris
7
^D在技术上并不是EOF,它告诉shell将其缓冲区刷新,换行符也有同样的作用。如果你在缓冲区为空时刷新它,那么就会得到EOF。因此,如果您在文本末尾按回车键,那么您只需要按一次^D即可。 - ughoavgfhw
c是一个整数。额外的字符用于后续。 - slmyers
1
@ughoavgfhw 给出了正确的答案(并应该将其发布为一个答案)。MoonFan - 尝试使用 echo abcde | ./example(或者你的程序叫什么就用什么)来查看它是否按照你的期望工作。 - Carl Norum
1个回答

0

c 是如何定义的?fgetc() 返回一个 int,而 EOF 也是一个 int。如果 c 是一个 char,它们将不匹配。


1
这个答案可能有用,但是如果在他的系统上char是有符号的,那么EOF通常是-1,所以它可能会正常工作。无论如何,这肯定不是OP问题的答案。 - Carl Norum
c是一个整数。额外的字符用于后续。 - slmyers

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