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
putchar
для записи десятичного значения EOF. - person Jongware   schedule 28.01.2015putchar
? - person Lightness Races in Orbit   schedule 28.01.2015-1
, является совершенно хорошим значением и для числа с плавающей запятой.) - person Jongware   schedule 28.01.2015%d
->-1
;%f
->1.#NAN0
;%s
-> [пусто];%x
-›ffffffff
- person maja   schedule 29.01.2015int
,double
,long
,short
,float
,char
, а затем приравнивание g c к значению EOF приводит к пустому выводу - person maja   schedule 29.01.2015==
) c кEOF
даетint
->Ç
;long
->Ç
;short
->@
;float
-> [пусто];char
-> [пусто] - person maja   schedule 29.01.2015