Я читал книгу K&R и хотел проверить функции printf() и putchar() способами, которые я никогда не пробовал. Я столкнулся с несколькими неожиданными событиями и хотел бы услышать от более опытных программистов, почему это происходит.
char c;
while((c = getchar()) != EOF) {
//put char(c);
printf("%d your character was.\n", c);
}
- Как получить EOF (конец файла) во входном потоке (функции getchar() или scanf())? Неожиданный ключ, который не распознается функцией getchar()/scanf(), может его создать?
- В моей книге сказано, что c должно быть целым числом, потому что оно должно хранить EOF, а переменная должна быть достаточно большой, чтобы содержать любой возможный символ, который может содержать EOF. Для меня это не имеет смысла, потому что EOF — это постоянное целое число со значением -1, которое может хранить даже char. Кто-нибудь может пояснить, что имелось в виду?
- Что происходит, когда я посылаю «привет» или «привет» в функцию putchar()? Он ожидает получить целое число, но возвращает странный вывод, такой как EE или oo, если я отправлю последнюю строку или последовательность символов.
- Почему, когда я использую функцию printf(), написанную выше, я получаю два вывода? Один - тот, который я ввел, а другой - целое число, которое в ASCII является концом строки. Производит ли он второй вывод, потому что я нажимаю ввод, который он принимает за второй символ?
Спасибо.
EOF
обычно равен -1,getchar()
возвращает его, когдаread()
из терминала возвращает 0. Вы не можете использоватьchar
дляgetchar
, потому что тогда в случае печати символа с кодом 255 (например, 'Ъ' в KOI8-R) вы получите ложныйEOF
. Чтобы скрыть вводимые символы, вы должны правильно настроить свой терминал (отключить эхо). - person Eddy_Em   schedule 24.06.2013EOF
, вы имеете в виду, что символ представляет собой целое число больше 1 байта и может быть распознано getchar(), если диапазон переменной установлен более 1 байта? - person Jonas Hoffmann   schedule 24.06.2013'hello'
не является допустимой строкой, возможно, это приводит к неопределенному поведению. Что-то между''
должно представлять только один символ. - person Bernhard Barker   schedule 24.06.2013EOF
нужно 2 байта, если это -1? Какие символы может ввести человек, чтобы приложение подумало, что этоEOF
? - person Jonas Hoffmann   schedule 24.06.2013(signed char)255 == (signed char)-1
верно. - person Medinoc   schedule 24.06.2013getchar()
вернет вам любое возможноеchar
, что означает любое значение от 0 до 255 (если беззнаковое). Но в случае ошибки он должен дать вам код ошибки, поэтомуgetchar()
должен возвращать как минимум 257 различных значений,char
— это тип, который не может различать более 256 значений. Так что вам нужен более широкий тип. По историческим причинамshort
не подходил (не был уверен, что его длина больше байта), тогда был выбранint
(уверен, что он достаточно длинный). Таким образом, техническиgetchar()
возвращает 0-255 в случае чтения реального символа и -1 в случае ошибки. Вы должны различать -1 и 255. - person Jean-Baptiste Yunès   schedule 24.06.2013