Ошибка EOF в CLion - PullRequest
       8

Ошибка EOF в CLion

0 голосов
/ 27 апреля 2018
#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 в реестре, поскольку предложение «Пожалуйста, введите символ:» находится в нужном месте, когда эта опция доступна. Но если я этого не сделаю, я не смогу использовать Ctrl + D для отправки EOF. Кроме того, кажется, что результат может быть правильным только тогда, когда я наберу Ctrl + D в новой пустой строке после символов.

Платформа: Windows 10, набор инструментов: MinGW

Кстати, я тоже пробовал Cygwin. Та же проблема возникла снова. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Приоритет оператора. @ Джонни Мопп

c = getchar() != EOF - это то же самое, что и c = (getchar() != EOF), конечно, не то, что хочет ОП.

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

но была проблема в том, что содержимое первого printf () не появлялось, пока я не ввел несколько слов.

stdout обычно буферизуется. Это может быть строка с буферизацией или полностью с буферизацией или вообще без нее. Используйте 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);
0 голосов
/ 27 апреля 2018

Проблема в том, что

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 абсолютным минимумом.

...