CLION中的EOF错误

时间:2018-04-27 19:22:15

标签: c clion

#include <stdio.h>

/*Checking whether the value of (getchar() != EOF) is 1,
  when not reaching the EOF*/
main() {
    int c;

    printf("Please enter character:\n");
    while (c = getchar() != EOF) {
        printf("%d\t", c);
    }
    printf("%d - at EOF\n", c);
} 

我在CLion中运行了这段代码,但是在我输入一些单词之前,第一个printf()天空中的内容出现了问题。

有一个例子。

error
^D
Please enter character:
1   1   1   1   1   1   0 - at EOF

我知道这可能是因为我在注册表中禁用了run.processes.with.pty选项,因为句子“请输入字符:&#39;当选项可用时,它位于正确的位置。但如果我不这样做,我就无法使用 Ctrl + D 来发送EOF。另外,只有当我在字符后的新空行中输入 Ctrl + D 时,结果似乎才是正确的。

平台:Windows 10,工具链:MinGW

顺便说一下,我也试过Cygwin。再次出现同样的问题。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

问题在于

c = getchar() != EOF

真的只是

c = (getchar() != EOF)

你想要的是

(c = getchar()) != EOF

如果您使用c = getchar() != EOF

,许多编译器都会生成警告
$ cc -c test.c -Wall -Wextra
test.c:5:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
 main() {
 ^~~~
test.c: In function ‘main’:
test.c:9:12: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
     while (c = getchar() != EOF) {
            ^

这就是建议启用警告的原因。对于新项目,我认为-Wall -Wextra是最低限度的。

答案 1 :(得分:0)

运营商优先权。 @Johnny Mopp

c = getchar() != EOFc = (getchar() != EOF)相同,当然不是OP想要的。

// while (c = getchar() != EOF)
while ((c = getchar()) != EOF)
  

但是出现了一个问题,即第一个printf()中的内容没有出现,直到我输入了一些单词。

stdout通常是缓冲的。它可能是 line 缓冲或完全缓冲或根本没有。使用fflush(stdout)确保发布输出。

printf("Please enter character:\n");
fflush(stdout); //add
while (c = getchar() != EOF) {
  printf("%d\t", c);
  fflush(stdout); //add
}
printf("%d - at EOF\n", c);