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.