ограничение размера спецификации преобразования printf - PullRequest
6 голосов
/ 20 октября 2010

printf спецификации преобразования: %, за которыми следуют флаги, ширина, точность, модификатор длины и спецификатор преобразования. Существуют ли практические ограничения на размер спецификации преобразования?

т.е. %s составляет 2 символа, а %08.2f - 6 символов. Мой вопрос: какова длина максимальной единственной спецификации в строке формата, которая может быть создана в соответствии со стандартом C99?

Ответы [ 3 ]

2 голосов
/ 20 октября 2010

Нет такой спецификации преобразования максимальной длины. Если вы думаете, что нашли такую ​​спецификацию, я могу предложить такую, которая будет на один символ длиннее.

Например, рассмотрим ширину и точность поля. Стандарт говорит, что они являются десятичными целыми числами, но не определяет их диапазон. Поэтому вы можете написать спецификаторы преобразования с произвольно большими целыми числами, такими как ширина поля или точность.

1 голос
/ 20 октября 2010

спецификациями преобразования printf являются%, за которыми следуют флаги, ширина, точность, модификатор длины и спецификатор преобразования.Существуют ли практические ограничения на размер спецификации преобразования?

В прошлом мне приходилось иметь дело с несколькими стандартными реализациями printf, и у меня сложилось общее впечатление, что особого ограничения не установлено.

Строка формата обычно анализируется символ за символом.(Подумайте просто FSM .) Большинство реализаций printf избегают внутренней буферизации чего-либо, и даже для чисел используется преобразование символ за символом в десятичное (даже не atoi).

Вы можете проверитьнапример, как printf реализован в ядре FreeBSD (где многие другие реализации часто поднимают код).Это, безусловно, упрощенная реализация (с парой специфичных для ядра настроек), но она отражает то, как часто обрабатывается строка формата.

NB Только что проверил реализацию vfprintf() в glibc, и они внутренне выделяют буфер (при необходимости) с помощьюmalloc().Так что никаких особых ограничений там нет.

Мой вопрос: какова длина максимальной единственной спецификации в строке формата, которую можно создать в соответствии со стандартом C99?

Насколько мне известно, спецификатор формата является частью строки и длина строки не ограничена стандартом.И, как я упоминал выше, я никогда не видел реализацию с таким ограничением.

1 голос
/ 20 октября 2010

Если вы имеете в виду буквальную строку, это 4095 символов

5.2.4.1 Пределы перевода
...
- 4095 символов в строковом литерале или в строковом литерале (после объединения)
...

Я был укушен ограничением C89 в 509 символов (не для строк формата printf / scanf), так что это одно из хороших изменений, внесенных C99: -)


Редактировать: реализация glibc ( не стандартное определение )

Реализация glibc получает ширину от функции read_int.
Итак, для этой реализации, по-видимому, может быть , предел INT_MAX ( Я не искал функцию read_int ).

...