Getchar() принимает данные, которые я печатаю с помощью printf()

#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() игнорировать это?

Спасибо

Попробуйте распечатать результат getchar и сравнение с EOF отдельно.

dbush 24.06.2024 16:39

У вас элементарное непонимание ввода-вывода. Помните, что на дисплее отображаются как данные, которые вы вводите на клавиатуре, так и данные, напечатанные вашей программой. Не сдавайтесь, но продолжайте учиться. (Это будет иметь смысл достаточно скоро!)

Dúthomhas 24.06.2024 16:41

Входная последовательность 1Ctrl-DCtrl-D должна делать то, что вы хотите — читать один символ, не завершающий строку, за которым следует указание конца файла.

Ian Abbott 24.06.2024 17:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не просто вводите 1. (Мы знаем это, потому что в обычных пользовательских интерфейсах нажатие клавиши 1 не приводит к немедленной отправке символа «1» в программу, если не приняты специальные меры. Итак, если вы просто нажали клавишу 1, программа не ответила бы.) Скорее всего, вы нажимаете клавишу 1 и клавишу Return или Enter.

При нажатии клавиши 1 в буфер записывается символ «1». При нажатии клавиши Return или Enter в буфер добавляется символ новой строки, а затем содержимое этого буфера отправляется в программу.

При первом выполнении программы getchar получает символ «1». Второе выполнение программы getchar получает символ новой строки.

Кроме того, нажатие Control-D не отправляет напрямую индикацию EOF.

Другие вопросы по теме