тип данных переменной, используемой для хранения ввода getchar(), как char вместо int

#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, но это не так. Почему?


person kasif    schedule 24.06.2014    source источник
comment
Ответил здесь символа файла в типе char">programmers.stackexchange.com/questions/197625/   -  person Pavan Manjunath    schedule 24.06.2014
comment
Держите вашу программу в недоступном для всех, кто говорит по-голландски. В котором орграф ij является обычной буквой, часто с кодом символа 255. Ничего страшного, нас всего 25 миллионов.   -  person Hans Passant    schedule 24.06.2014
comment
Чтобы ответить на ваш вопрос в последнем абзаце: прежде чем putchar напечатать значение, оно преобразует его в unsigned char. Итак, если предположить, что EOF равно -1 (что не обязательно, но чаще всего так и есть), приведение к (8-битному) unsigned char дает 0xFF, что, в зависимости от вашей кодировки, может быть допустимым символом или нет ( например, в UTF-8 этот байт не может встречаться ни в какой допустимой последовательности). Так что возможно вы его просто не видите, хотя он выводится. Направьте вывод через hexdump или запишите его в файл.   -  person mafso    schedule 24.06.2014
comment
это откровение! @ХансПассант   -  person kasif    schedule 24.06.2014
comment
Возможный дубликат Разница между int и char в getchar() и putchar ()?   -  person Antti Haapala    schedule 13.02.2016


Ответы (2)


Является ли char подписанным или беззнаковым, определяется реализацией.

Если char не имеет знака, то никакое значение char не может быть равно EOF, цикл никогда не завершится.

Если char подписано, то EOF может быть равно c, это то, что происходит на вашей машине. Но проблема в том, что это также означает, что допустимое char может быть равно EOF, что приведет к слишком раннему выходу из цикла.

person Yu Hao    schedule 24.06.2014

But when I declare c as a char, and input the EOF(CTRL-Z + Enter),that 
value(which is -1 on my computer)does go into c and I immediately end up 
exiting the while up, just the way it happens if I declare c as an int.

Напомним, что getchar эквивалентен getc(stdin). Когда вы достигаете eof, это условие устанавливается на stdin, ваш тест в цикле больше не может быть верным. Таким образом, цикл завершается независимо от того, используете ли вы int, char или unsigned char.

One more thing, in the second putchar statement, it should print the 
last value of c (ie. -1) after having received EOF but it doesn't. Why?

По той же причине при достижении EOF цикл завершается без вызова putchar.

person David C. Rankin    schedule 24.06.2014