2017-01-21 11 views
-1

У меня есть задача перекодировки printf с большей частью его функциональности (на C). Однако при выполнении некоторых тестов я обнаружил проблему: я не понимаю, как работает стандартная функция, когда пользователь ставит более одного модификатора (разрешенные модификаторы - h, hh, l, ll, z и j).
Например:Флаги и модификаторы printf в C

printf("%hhld", 128) results in 128 printed out; 
printf("%lhhd", 128) results in 128 printed out; 
printf("%lhhd", 9223372036854775807) shows 9223372036854775807; 
printf("%lhhd", 9223372036854775808) shows -9223372036854775808; 
printf("%hhld", 9223372036854775807) shows 9223372036854775807; 
printf("%hhld", 9223372036854775808) shows -9223372036854775808; 

Что модификатор будет выбран и как Printf выбрать его? Почему это всегда игнорируется в этой ситуации?

Другой вопрос: должен ли мой printf работать с флагами и модификаторами в случайном порядке или нет? Потому что в вики, статья упоминает определенный порядок:

% [параметр] [флаги] [ширина] [. Точность] [длина] Тип

ответ

3

Это неопределенное поведение, прочитайте документацию.

В основном передача параметра, который имеет другой тип, чем тот, который ожидается спецификатором, считается стандартным по стандарту.

Вы также смешивание несовместимых спецификаторов, снова «просто читать документацию», это хорошая документация, если вы хотите, чтобы полностью понять поведение printf(3).

+0

Вы бы так любезны объяснить это мне или определить точную линию в человеке? Я читал его несколько раз и до сих пор не вижу ответа на мой вопрос. – kjioyh

+0

В документах, связанных ответом выше в разделе «* Модификатор длины *», фраза «* Следующее целочисленное преобразование соответствует ... *» может быть прочитана как «Использовать этот модификатор длины только с ...». Ваш код делает не соответствуют этим правилам. И при этом вызывает неопределенное поведение. – alk

 Смежные вопросы

  • Нет связанных вопросов^_^