Программа, которая копирует свой ввод в свой вывод по одному символу за раз - PullRequest
1 голос
/ 25 октября 2019

Я видел этот метод копирования. В цикле вы читаете символы один за другим и также печатаете их. Когда я пытаюсь воспроизвести это, у меня возникает несколько проблем:

  1. мой цикл никогда не заканчивается - это означает, что EOF ;
  2. мой вывод - какой-то странный символкоторые повторяются - какую бы последовательность символов / символов я не вводил;

Я пробовал с int, а также с char, но я красный этот поток , и я понялчто это должно быть int, потому что char не имеет терминатора EOF.

Также я не понимаю, зачем использовать int, когда оно должно быть char.

int x;

while(x = getchar() != EOF){
    putchar(x);
}

return 0;

Я ожидал скопировать введенный текст для вывода, а затем выйти с кодом 0. Фактический вывод:. (здесь не видно).

Ответы [ 2 ]

2 голосов
/ 25 октября 2019
while(x = getchar() != EOF)

должно быть

while((x = getchar()) != EOF)

Ваш код эквивалентен

while(x = (getchar() != EOF))

Также я не понимаю, зачем использовать int, когда оно должно быть char.

Поскольку EOF не может быть представлен char. Все значения, которые могут быть представлены char, также могут быть представлены int, но не наоборот. Но если getchar() не вернет EOF, он вернет значение, которое может быть представлено символом. Так что этот код в порядке:

while((x = getchar()) != EOF) {
    char c = x; // Will always work if you have checked for EOF

Важно!

Обратите внимание, что это:

char x;
while((x = getchar()) != EOF)

будет работать. Это завершит цикл на EOF. Но также будет другая ценность, которая будет ошибочно интерпретироваться как EOF. Это можно продемонстрировать с помощью этого фрагмента:

char c = EOF;
if((char)255 == c)
       printf("Ooops!\n");
0 голосов
/ 25 октября 2019

мой цикл никогда не заканчивается - это значит, что EOF

необходимо вводить в конец последовательности "end of file" при вводе данных:

-On Linux и macOS это Ctrl-D ;

-On Windows это Ctrl-Z ;

Например, ввод ^ZinputSequence не приведет к выводу с последующим завершением программы

мой вывод - какой-то странный символ, который повторяется - независимо от последовательности символов / символов Iinput;

Это вопрос приоритета оператора (отсутствует пара скобок)

while(x = getchar() != EOF)

должно быть

while((x = getchar()) != EOF)

В моем случае это былопроисходит:

while(x = (getchar() != EOF))

Это означает, что x было равно true соответственно 1 . Таким образом, putchar () выводил эквивалент 1 в таблице ASCII (SOH - начало заголовка, представленное в моей консоли в виде смайлика).

Также я не понимаю, зачем использовать int , когда оно должно быть char .

Требуется что-то другое для , указывающего конец , и это не может быть переменная char (которая фактически является числом от 0 до 255), поскольку каждое из этих чисел является четко определенным символом.

  • EOF - целое число, определенное в <stdio.h>, но числовое значение не имеет большого значения, если его нельзя спутать с каким-либо действительнымсимвол.

Спасибо @ klutt и @ Какой-то программист чувак за них отвечает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...