ограничение по размеру спецификации преобразования printf
-
09-10-2019 - |
Вопрос
printf
спецификациями преобразования являются %
далее следуют флаги, модификатор ширины, точности, длины и спецификатор преобразования.Существует ли практическое ограничение на размер спецификации преобразования?
То есть. %s
имеет длину 2 символа, в то время как %08.2f
имеет длину 6 символов.Мой вопрос в том, какова длина максимальной одиночной спецификации в строке формата, которая может быть создана в соответствии со стандартом C99?
Решение
Такой спецификации преобразования максимальной длины не существует.Если вы думаете, что нашли такую спецификацию, я могу предложить ту, которая на один символ длиннее.
Например, рассмотрим ширину поля и точность.Стандарт гласит, что это десятичные целые числа, но не указывает их диапазон.Поэтому вы можете написать спецификаторы преобразования с произвольно большими целыми числами в качестве ширины поля или точности.
Другие советы
Если вы имеете в виду буквальную строку, это 4095 символов
5.2.4.1 Ограничения перевода
...
- 4095 символов в символьной строке буквального или широкого строкового литерала (после конкатенации)
...
Я был укушен пределом C89 в 509 символов (не для форматирования форматирования printf / Scanf), поэтому это одна из хороших изменений, связанных с C99 :-)
Редактировать: Реализация Glibc (не стандартное определение)
Реализация Glibc получает ширину из read_int
функция.
Так, Для этой реализации, видимо, может быть,, предел INT_MAX (Я не искал read_int
функция).
Спецификации преобразования Printf являются%, а затем флаги, ширина, точность, модификатор длины и спецификатор преобразования. Есть ли практические ограничения на размер спецификации преобразования?
Я должен был разобраться в прошлом с несколькими стандартами printf
Реализации и мое общее впечатление, что нет конкретного предела.
Строка формата, как правило, анализирует символ по характеру. (Думай простой Отделение.) Большинство printf
Реализации Избегайте буферизации чего-либо внутренне и даже для чисел используют CHAR по преобразованию CHAR в десятичные (даже не atoi
).
Вы можете проверить, например, как printf
реализован внутри FreeBSD ядро (где из многих других реализаций часто поднимают код). Это, безусловно, упрощенное внедрение (с парами пара, специфичных к ядрам), но это отражает то, как часто обрабатывается строка формата.
NB только что проверил Glibc vfprintf()
внедрение, и они выделяют внутренне буфер (при необходимости) с malloc()
. Отказ Так что ни один конкретный предел там нет.
Мой вопрос, какова длина максимальной единственной спецификации в строке формата, которая может быть создана, согласно стандарту C99?
Спецификатор формата является частью строки и длины строки для моих знаний не ограничены стандартом. И как я упоминаю выше, ни один я никогда не видел реализацию любым таким пределом.