#include <stdio.h>
int main() {
int c;
for (int i = 0; i < 10; i++) {
c = (getchar() != EOF);
printf("%d\n", c);
}
printf("As we can see, the value of c is either 0 or 1 (as claimed in the "
"book)\n");
return 0;
}
Я написал этот код на C, чтобы показать, что c = (getchar() != EOF)
равен либо 0, либо 1. Однако, когда я запускаю код и набираю, скажем, 1, он печатает 1 два раза. Когда я нажимаю Ctrl-D
, который печатает символ EOF, он просто печатает 0 для оставшихся итераций цикла.
Итак, я попытался избавиться от цикла и запустить код внутри цикла один раз, и он работал нормально. Я подозреваю, что getchar()
читает то, что я печатаю printf()
. Если это так, то что мне нужно сделать, чтобы getchar()
игнорировать это?
Спасибо
У вас элементарное непонимание ввода-вывода. Помните, что на дисплее отображаются как данные, которые вы вводите на клавиатуре, так и данные, напечатанные вашей программой. Не сдавайтесь, но продолжайте учиться. (Это будет иметь смысл достаточно скоро!)
Входная последовательность 1
Ctrl-D
Ctrl-D
должна делать то, что вы хотите — читать один символ, не завершающий строку, за которым следует указание конца файла.
Вы не просто вводите 1. (Мы знаем это, потому что в обычных пользовательских интерфейсах нажатие клавиши 1 не приводит к немедленной отправке символа «1» в программу, если не приняты специальные меры. Итак, если вы просто нажали клавишу 1, программа не ответила бы.) Скорее всего, вы нажимаете клавишу 1 и клавишу Return или Enter.
При нажатии клавиши 1 в буфер записывается символ «1». При нажатии клавиши Return или Enter в буфер добавляется символ новой строки, а затем содержимое этого буфера отправляется в программу.
При первом выполнении программы getchar
получает символ «1». Второе выполнение программы getchar
получает символ новой строки.
Кроме того, нажатие Control-D не отправляет напрямую индикацию EOF.
Попробуйте распечатать результат
getchar
и сравнение с EOF отдельно.