K&R 1-7 это разрешимо с помощью putchar() вместо printf?

Есть много вопросов об этом упражнении по всему Интернету, но я не смог найти никакого решения (или подсказки) о том, как решить это упражнение, используя "putchar".

Write a program to print the value of EOF.

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

printf("%d", EOF);

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

Пишу:

putchar(EOF);

или же

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

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

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 функция делает что-то похожее, поиск примеров реализации может дать некоторые идеи.

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

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

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

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

int putchar(int c);

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

а также

putc() эквивалентно fputc().......fputc() пишет персонаж cбросить на unsigned char, чтобы stream,

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

Итак, если значение EOF это непечатаемый символ [в ASCII], вы ничего не увидите ["без показа текста"] в stdout.

Другие вопросы по тегам