Руководство по спецификатору формата для C

Есть ли полное онлайн-руководство для спецификаторов формата C для каждого типа данных и для всех случаев? Я нашел только частичные и противоположные ссылки, которые не объясняют все возможные случаи.


person Davide Testa    schedule 18.12.2018    source источник
comment
Что-то не так с printf (3) и scanf (3)?   -  person David C. Rankin    schedule 18.12.2018
comment
Дэвид, есть небольшая разница между тем, что позволяет Linux или glibc, и тем, что позволяет C. Я бы надеялся, что первое было надмножеством второго, но я не уверен. В любом случае, если бы вы использовали расширенный материал, он не обязательно был бы переносимым на другие реализации C.   -  person paxdiablo    schedule 18.12.2018
comment
bytes_written + = printf (список аргументов здесь); иногда полезно проверить количество байтов, просто чтобы убедиться, что форматирование не только синтаксически правильное, но и дает правильное количество байтов.   -  person Krassi Em    schedule 19.12.2018
comment
См. Также справочник C. Но, конечно, стандартный printf не может обрабатывать каждый тип.   -  person Basile Starynkevitch    schedule 19.12.2018


Ответы (1)


окончательным руководством по этому вопросу является сам действующий стандарт ISO. Любой другой источник страдает потенциальным недостатком, состоящим в том, что он может быть неправильным или неполным. Стандарт, по определению, является одновременно правильным и полным (a).

И хотя документы стандартов иногда могут быть сухими и трудными для чтения, разделы, посвященные спецификаторам формата, достаточно ясны как с точки зрения того, что означают все спецификаторы (включая флаги, спецификаторы ширины / точности и модификаторы длины), так и с точки зрения данных. типы, которые вам разрешено использовать с этими спецификаторами.

Например, C11 (b) подробно описывает все спецификаторы формата в 7.21.6.1 и 7.21.6.2 для семейств функций printf и scanf соответственно. Последний бесплатный вариант этой итерации стандарта - это N1570 документ.

Фактически, это стандарт C11 - официально это последняя версия < em> черновик C11, и, чтобы получить настоящий стандарт, вам необходимо купить его в органе по стандартизации вашей страны. Однако различия незначительны и, как правило, носят административный характер.


(a) Я не имею в виду, что стандарт полностью согласован или не содержит ошибок, просто он является стандартом. Это означает, что ожидающие санкционированные изменения реализации должны следовать указанному стандарту, чтобы считаться C. Если реализация делает это, она действительна, независимо от того, какое безумие может иметь в ней стандарт :-)


(b) Хотя C11 (итерация, которую мы используем и поэтому наиболее знакомы) могла быть официально заменена на C18, изменения касались только включения TC и исправлений дефектов. Никаких существенных изменений в «мясе» стандарта, в частности по этому вопросу, в спецификаторах формата, не произошло.

person paxdiablo    schedule 18.12.2018
comment
C 2011 был отозван и заменен на C 2018. В этом вопросе отслеживаются версии стандартов C и C ++, а последняя версия стандарта C 2018 - здесь. - person Eric Postpischil; 18.12.2018
comment
@Eric, я считаю, что C18 - это немного больше, чем C11 с включенными TC и DR, просто потому, что есть ограничение на то, сколько из них им разрешено делать в соответствии со стандартом перед повторным выпуском. Поскольку в C18 нет реальных функциональных изменений, маловероятно, что спецификаторы формата изменились. - person paxdiablo; 18.12.2018
comment
C 2011 года был отменен. Это не «окончательное руководство», как вы пишете, и не «сам действующий стандарт ISO». - person Eric Postpischil; 18.12.2018
comment
@Eric, я никогда не утверждал, что c11 был текущим стандартом и, следовательно, окончательным, просто что стандарт ISO является окончательным (и так оно и есть). Затем я использовал c11 в качестве примера. В любом случае используйте c18, если хотите, но, как объяснялось в предыдущем комментарии, спецификаторы формата такие же. Я постараюсь прояснить это. - person paxdiablo; 18.12.2018
comment
Рассмотрим это так: почему в вашем ответе вообще упоминается C 2011? Есть ли причина, по которой лучше направлять людей на C 2011, а не на 2018? Или вы просто по привычке об этом написали? Если нет причин предпочитать C 2011, почему бы не отредактировать свой ответ, чтобы представить только текущий стандарт, который является официальной версией? - person Eric Postpischil; 18.12.2018
comment
@ Эрик, я ценю ваш вклад, но думаю, что оставлю все как есть. Я объяснил обоснование в сноске. Если вы думаете, что ответ, ссылающийся на c18, был бы лучше, вам, вероятно, следует добавить его и позволить SO решить. - person paxdiablo; 19.12.2018
comment
Спецификация printf в стандарте имеет много несоответствий и двусмысленностей (например, в нем говорится, что printf("%u", 1); не определено, но printf("%lx", -1); не является неопределенным), я бы не стал называть его правильным и полным. Но это, безусловно, лучше, чем любой из других доступных вариантов. - person M.M; 19.12.2018
comment
@ M.M: Я имел в виду правильный и полный, поскольку он является стандартом, следовательно, соответствующие реализации должны делать то, что он говорит. Я не комментирую разумность документа, предпочитая путь, взятый в обосновании C99 (перефразированном): это обоснование не является обоснованием для языка C в целом: не предпринимается никаких попыток защищать язык :-) - person paxdiablo; 19.12.2018