K&R 1-7 можно ли решить, используя putchar() вместо printf?

В Интернете есть много вопросов об этом упражнении, но я не смог найти ни одного решения (ни подсказки) о том, как решить это упражнение с помощью «putchar».

Write a program to print the value of EOF.

Я могу легко получить рабочий ответ на это:

printf("%d", EOF);

Я хотел бы знать, есть ли какие-либо известные (или логические) ответы с использованием «putchar» (поскольку я предполагаю, что это была вся цель упражнения, расположенного в конце абзаца о «getchar» и «putchar»)

Письмо:

putchar(EOF);

or

int c;
c = EOF;
putchar(c);

программа просто запускается и закрывается без отображения текста.


person maja    schedule 28.01.2015    source источник
comment
здесь напечатан символ ... Но я не уверен, что понимаю, какой результат вы ожидаете здесь. Значение EOF является целым числом (обычно -1).   -  person Maxime Chéramy    schedule 28.01.2015
comment
Возможно, вам следует использовать putchar для записи десятичного значения EOF.   -  person Jongware    schedule 28.01.2015
comment
Почему вы считаете необходимым использовать здесь putchar?   -  person Lightness Races in Orbit    schedule 28.01.2015
comment
Спойлер: stackoverflow.com/q/11975780/1025391   -  person moooeeeep    schedule 28.01.2015
comment
@ Jongware, рассматривающий EOF как число с плавающей запятой, просто возвращает какую-то тарабарщину @Lightness _Races_in_Orbit Я попросил просто убедиться (как я уже писал, упражнение представлено в разделе о putchar)   -  person maja    schedule 28.01.2015
comment
Но числовое значение не означает автоматически плавающее значение! (Хотя вы можете делать что-то не так. Обычное значение EOF, -1, является совершенно хорошим значением и для числа с плавающей запятой.)   -  person Jongware    schedule 28.01.2015
comment
Вот несколько примеров использования разных типов в printf: %d -> -1; %f -> 1.#NAN0; %s -> [пусто]; %x -› ffffffff   -  person maja    schedule 29.01.2015
comment
объявление c равным int, double, long, short, float, char, а затем приравнивание g c к значению EOF приводит к пустому выводу   -  person maja    schedule 29.01.2015
comment
извините, приравнивание (==) c к EOF дает int -> Ç; long -> Ç; short -> @; float -> [пусто]; char -> [пусто]   -  person maja    schedule 29.01.2015
comment
(последние два комментария означали объявление c, а затем вызов его с помощью putchar   -  person maja    schedule 29.01.2015


Ответы (4)


putchar преобразует свой аргумент в unsigned char перед выводом (и это записываемый символ, а не результат десятичного преобразования). Поскольку EOF имеет отрицательное значение, это преобразование не обеспечивает сохранения стоимости. Обычно EOF имеет значение -1, с 8-битным char это преобразование приводит к 255, то есть putchar(EOF) эквивалентно putchar('\xff'), который не является печатным символом (при условии, что используется система ASCII). Передача вывода на hexdump -C сделает вывод видимым.

Без использования printf и друзей можно написать функцию, выводящую десятичное число для int. В основном,

print a '-' if the value is negative
for every decimal digit, starting from the highest-valued:
    convert the digit's value to a character (e.g. 7 should become '7')
    try to print the result (with putchar, for example)
    if that fails, return an error indicator

Подсказка: операторы деления и модуля, / и %, будут полезны.

Цифры '0' ... '9' восходящие (и смежные); поэтому для преобразования значения цифры в символ добавление '0' дает желаемый результат (например, 3 + '0' равно '3').

Необходимо соблюдать осторожность, чтобы избежать целочисленного переполнения, даже если в функцию передаются угловые случаи, такие как INT_MIN. -INT_MIN может привести к переполнению (и фактически происходит почти во всех системах), с другой стороны, положительное число всегда может быть инвертировано. Значение 0 может потребовать специальной обработки.

(В качестве альтернативы число можно сначала преобразовать в строку, которую затем можно вывести. Массив char размера 1 + sizeof(int)*CHAR_BIT/3+1 + 1 достаточно велик, чтобы содержать эту строку, включая знак минус и 0-разделитель.)

Если вы застряли, (нестандартная) функция itoa делает что-то подобное, поиск примеров реализации может дать некоторые идеи.

person mafso    schedule 28.01.2015

EOF не является символом, который можно распечатать так, как вы ожидали. Таким образом, putchar(EOF) не печатает никаких значений, так как печатает только char.

Следовательно, используйте printf("%d", EOF), который выводит целое число -1.

person Sunil Bojanapally    schedule 28.01.2015

putchar(int char) Таким образом, если вы передаете значение ASCII в этот API, вы получаете соответствующий символ, напечатанный на экране, но EOF оценивается как -1, который не является печатаемым символом ASCII, поэтому вы ничего не видите или можете увидеть какой-то мусор.

person Gopi    schedule 28.01.2015

Согласно справочной странице putchar(),

int putchar(int c);

putchar(c); эквивалентно putc(c,stdout).

и

putc() эквивалентно fputc() .......fputc() записывает символ c, преобразованный в unsigned char, в stream.

Предполагается, что putchar() выводит char представление значения ASCII, предоставленного в качестве аргумента.

Таким образом, если значение EOF является непечатаемым символом [в ASCII], вы ничего не увидите ["без отображения текста"] на стандартном выходе.

person Sourav Ghosh    schedule 28.01.2015
comment
Спасибо @LightnessRacesinOrbit. - person Sourav Ghosh; 28.01.2015