int c = getchar ()? - PullRequest
       9

int c = getchar ()?

22 голосов
/ 19 августа 2011

хорошо, так что я читаю эту книгу: Язык программирования C - Керниганом и Ричи (второе издание) и один из примеров, у меня возникают проблемы с пониманием, как все работает.1004 * где написано c = getchar (), как целое число = символы вводятся из командной строки?Целые числа да, но как хранятся набираемые символы?

Заранее спасибо

Ответы [ 5 ]

30 голосов
/ 19 августа 2011

В отличие от некоторых других языков, которые вы, возможно, использовали, символы в C являются целыми числами. char - это просто еще один целочисленный тип, обычно 8 бит и меньше int, но все же целочисленный тип.

Итак, вам не нужны функции ord() и chr(), которые существуют в других языках, которые вы, возможно, использовали. В C вы можете конвертировать между char и другими целочисленными типами, используя приведение или просто назначая.

Если не происходит EOF, определено, что getchar() возвращает "неподписанный символ, преобразованный в целое число" (, аналогично fgetc ), поэтому, если это поможет, вы можете представить, что он читает какой-то символ, c, затем возвращает (int)(unsigned char)c.

Вы можете преобразовать это обратно в unsigned char просто путем приведения или присвоения, и, если вы хотите получить небольшую потерю теоретической переносимости, вы можете преобразовать его в char с помощью приведения или назначением это к char.

11 голосов
/ 19 августа 2011

Функция getchar() возвращает целое число, которое является представлением введенного символа.Если вы введете символ A, вы получите 'A' или 0x41 возвращенный (повышенный до int и предполагающий, что вы, конечно, в системе ASCII).

Причина, по которой он возвращаетсяint, а не char, потому что он должен иметь возможность хранить любой символ плюс индикатор EOF, где входной поток закрыт.

И для чего это стоитЭто не очень хорошая книга для начинающих.Это из тех дней, когда эффективность имела значение больше, чем удобочитаемость и удобство обслуживания.

Хотя это показывает, насколько умны такие, как K & R, вам, вероятно, стоит подумать о чем-то более ... дружественном для новичков.* В любом случае, последний выпуск этого издания посвящен C89, и с тех пор многое изменилось.Мы прошли через C99 и теперь имеем C11, и книга не была обновлена, чтобы отразить ни одну из них, поэтому она ужасно устарела.

4 голосов
/ 19 августа 2011

Тип C char равен 8 битам, что означает, что он может хранить диапазон целых чисел из (в зависимости от того, подписан он или нет и стандарт C не определяет, какой он есть, если вы его не указали) От -128 до 127 или от 0 до 255 (255 различных значений; это диапазон ASCII). getchar() возвращает int, что будет не менее 16 бит (обычно 32 бита на современных машинах). Это означает, что он может хранить диапазон char, а также другие значения.

Причина, по которой тип возвращаемого значения равен int, заключается в том, что специальное значение EOF возвращается при достижении конца входного потока. Если бы тип возвращаемого значения был char, то не было бы никакого способа сообщить о том, что был достигнут конец потока (если только он не взял указатель на переменную, в которой было записано это условие).

0 голосов
/ 13 июня 2014

Ответ на ваш вопрос получен.Но просто добавьте еще 1 вещь.

Поскольку вы объявляете переменную c как int.Совершенно очевидно, что вы берете значения из 0 to 9, имеющие значение ascii 48-57.Таким образом, вы можете просто добавить еще 1 строку к коду -

c = c-48.

0 голосов
/ 19 августа 2011

Каждый символ (включая цифры), введенный в командной строке, читается как символ, и каждый символ имеет целочисленное значение на основе его кода ASCII http://www.asciitable.com/.

...