Неправильные спецификаторы формата в scanf (или) printf
Что касается функции printf
, я понимаю следующее из нескольких ссылок и экспериментов.
- Когда мы пытаемся напечатать целочисленное значение с помощью спецификаторов формата, которые используются для float (или) double , и наоборот, поведение непредсказуемо .
- Но можно использовать
%c
для печати символьного эквивалента целочисленного значения. Также допустимо использование%d
для вывода значения ASCII (целочисленных представлений) символа.
Аналогичным образом, каково поведение scanf
, если имеется несоответствие спецификатора формата и аргументы переданы в scanf . Стандарты определяют это?
1 ответ
Аргументы Variadic (те, которые соответствуют многоточию, ...
) продвигаются по умолчанию . Это означает, что все более короткие целочисленные типы переводятся в int
(или, в зависимости от ситуации, без знака). Нет разницы между целыми числами и символами ( я полагаю ). Разница между %d
и %c
в ---- +: = 4 =: + ---- - это просто способ отформатировать .
printf
- это другой котелок с рыбой. Все передаваемые аргументы являются указателями . Среди указателей нет продвижения по умолчанию, и очень важно, чтобы вы передали точный спецификатор формата, соответствующий типу указателя.
В любом случае, если ваш спецификатор формата не соответствует предоставленному аргументу (например, передача scanf
в int *
в %p
), результат не определен поведение , что гораздо хуже, чем быть «непредсказуемым» - это означает, что ваша программа просто плохо сформирована.