ограничение по размеру спецификации преобразования printf

StackOverflow https://stackoverflow.com/questions/3977831

  •  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?

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top