#include<stdio.h>
int main()
{
int c;
while((c=getchar())!=EOF)
putchar(c);
putchar(c); //2nd putchar
getch();
}
В приведенном выше коде из книги «C by Ritchie n Kernighan» причина объявления c
переменной int
указана как:
так что
c
может содержать кодEOF
, который находится за пределами кодов символов, которые может вместить тип данныхchar
.
Но когда я объявляю c как char и ввожу EOF
(CTRL-Z + Enter), это значение (которое на моем компьютере равно -1) действительно входит в c, и я сразу же заканчиваю тем, что выхожу из while up, именно так, как это произойдет, если я объявлю c как int. Зачем нам объявлять c как int, когда char работает нормально?? или я что-то пропустил здесь?
Еще одна вещь, во втором операторе putchar
он должен напечатать последнее значение c (т.е. -1) после получения EOF
, но это не так. Почему?
putchar
напечатать значение, оно преобразует его вunsigned char
. Итак, если предположить, чтоEOF
равно -1 (что не обязательно, но чаще всего так и есть), приведение к (8-битному)unsigned char
дает0xFF
, что, в зависимости от вашей кодировки, может быть допустимым символом или нет ( например, в UTF-8 этот байт не может встречаться ни в какой допустимой последовательности). Так что возможно вы его просто не видите, хотя он выводится. Направьте вывод черезhexdump
или запишите его в файл. - person mafso   schedule 24.06.2014