Есть ли полное онлайн-руководство для спецификаторов формата C для каждого типа данных и для всех случаев? Я нашел только частичные и противоположные ссылки, которые не объясняют все возможные случаи.
Руководство по спецификатору формата для C
Ответы (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 и исправлений дефектов. Никаких существенных изменений в «мясе» стандарта, в частности по этому вопросу, в спецификаторах формата, не произошло.
printf("%u", 1);
не определено, но printf("%lx", -1);
не является неопределенным), я бы не стал называть его правильным и полным. Но это, безусловно, лучше, чем любой из других доступных вариантов.
- person M.M; 19.12.2018
printf
не может обрабатывать каждый тип. - person Basile Starynkevitch   schedule 19.12.2018