Неожиданный вывод путча при чтении целочисленного ввода с getchar - PullRequest
3 голосов
/ 19 сентября 2011

Я проходил эту программу:

#include<stdio.h>

main()
{
 int c;

 c = getchar();

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

Поскольку переменная c является целочисленной, в ней должно храниться целочисленное эквивалентное значение для данного ввода. Выходные данные показывают, что 'a' печатается как 'a', 'b' как 'b' и 'c' как 'c', но когда я вошел в хранилище 65, вывод также был 65! Так что должна быть некоторая разница в форматах хранения значения 65 и char 'a'

Как оба значения отличаются друг от друга?

Ответы [ 3 ]

2 голосов
/ 19 сентября 2011

Это потому, что ввод 65 рассматривается как два разных символьных ввода, и программа печатает их последовательно.

Когда вы ввели 6, программа мгновенно читает его и проверяет, что это не EOF, поэтому выводит его на консоль. Затем, когда вы ввели 5, он снова принимает его в качестве ввода. Поскольку это также не EOF, ваша программа снова печатает его.

Итак, вы вводите два символа, и эта программа правильно выводит их на консоль, как и положено. Кроме этого, нет никакой дискриминации. Целочисленный эквивалент a равен 65, поэтому он напечатает 65, если вы напечатаете символ, подобный этому -

 char c = 'a';
 printf("%d", c);    // will print 65

и это напечатает a -

int i = 65;
printf("%c", i);    // will print a
1 голос
/ 20 сентября 2011

Нет, нет разницы в хранении 65 и «а». Присвоение любого из них переменной дает точно такой же результат. Разница относится только к входу и выходу символа. Например. printf ("% c", 65) выдает 'a', потому что это часть определения printf(). То же самое верно и для двух других упомянутых вами функций, putchar() и getchar().

1 голос
/ 20 сентября 2011

Ваш код выполняется точно так, как написано, однако путаница заключается в том, что вы понимаете вводимые в программу данные.

Когда вы вводите 65, оно интерпретируется как два напечатанных символа, а именно '6' и '5'.Как вы заметили, это то, что выводилось на консоль каждый раз, когда putchar(c) вызывался в цикле while.

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