2010-10-20 10 views
6

printf las especificaciones de conversión son % seguidas de indicadores, ancho, precisión, modificador de longitud y especificador de conversión. ¿Existe un límite práctico al tamaño de una especificación de conversión?límite de tamaño de la especificación de conversión printf

I.e. %s tiene 2 caracteres de largo, mientras que %08.2f tiene 6 caracteres de largo. Mi pregunta es, ¿cuál es la longitud de la especificación única máxima en una cadena de formato que se puede crear, de acuerdo con el estándar C99?

+0

Ah, ya veo, usted está interesado en los límites prácticos en una especificación de formato único de una cadena de formato. Borro mi respuesta entonces. –

+0

Tengo curiosidad: ¿hay alguna razón por la que quieras saber además de la curiosidad? – nategoose

+0

@nategoose: estoy considerando un envoltorio muy especial sobre 'snprintf' y quiero saber si puedo asignar algunos almacenamientos intermedios temporales estáticamente – zaharpopov

Respuesta

2

No existe tal especificación de conversión de la longitud máxima. Si crees que has encontrado tal especificación, puedo encontrar una que sea una charla más larga.

Por ejemplo, considere el ancho y la precisión del campo. El estándar dice que son enteros decimales pero no especifica su rango. Por lo tanto, puede escribir especificadores de conversión con enteros arbitrariamente grandes como ancho de campo o precisión.

+0

por eso se preguntó "práctico" en cuestión, después de todo este ancho es limitado y los valores grandes no son válidos. incluso si es de 64 bits, está prácticamente limitado – zaharpopov

+1

Si bien 'printf' probablemente no impone (y no es obligatorio) ningún límite, el hecho de que' printf' devuelva la cantidad de caracteres impresos significa que no se especificará/indefinirá (no aclare qué comportamiento si utiliza anchos/precisiones de campo increíblemente grandes. Una razón más realista por la que el especificador de formato podría ser de longitud ilimitada son los indicadores redundantes, p. '% +++++++++++++++++++++++ d'. –

+0

@zaharpopov: Bueno, hay dos enfoques en la pregunta 1) prácticos 2) según el estándar. Tomé el último acercamiento. El primero depende de la implementación del compilador y la biblioteca. – laalto

1

Si se refiere a una cadena literal, es de 4095 caracteres

5.2.4.1 límites de traducción
...
- 4095 caracteres en una cadena de caracteres literal de cadena o ancho literal (después de la concatenación)
...

me ha picado límite de C89 de 509 caracteres (no para las cadenas de formato printf/scanf), así que este es uno de los buenos cambios introducidos de C99 por :-)


Editar: aplicación glibc (no Definición estándar)

aplicación glibc obtiene el ancho de una función read_int.
Así, para esta aplicación, por lo visto, tal vez, el límite es INT_MAX (no he buscado la función read_int).

+1

sí, pero de esto no se trata mi pregunta. el formato puede no ser literal, mi pregunta es sobre la longitud del especificador máximo después de '%' – zaharpopov

1

printf las especificaciones de conversión son% seguidas por las banderas, el ancho, la precisión, el modificador de longitud y el especificador de conversión. ¿Existe un límite práctico al tamaño de una especificación de conversión?

Tuve que lidiar en el pasado con varias implementaciones estándar de printf y mi impresión general de que no se impone ningún límite en particular.

La cadena de formato generalmente se analiza carácter por carácter. (Piense en FSM.) La mayoría de las implementaciones de printf evitan el almacenamiento en el búfer de cualquier cosa internamente e incluso para los números utilizan la conversión de char por char a decimal (ni siquiera atoi).

Puede comprobar, por ejemplo, cómo se implementa printf dentro del FreeBSD kernel (donde desde muchas otras implementaciones a menudo levanta el código). Sin duda, se trata de una implementación simplificada (con un par de ajustes específicos del kernel), pero refleja cómo se maneja a menudo la cadena de formato.

N. B.Acabo de comprobar la implementación de glibc vfprintf() y asignan internamente un búfer (si es necesario) con malloc(). Entonces ninguno de los dos límites allí.

Mi pregunta es, ¿cuál es la longitud de la especificación única máxima en una cadena de formato que se puede crear, de acuerdo con el estándar C99?

El especificador de formato es una parte de una cadena y la longitud de la secuencia que, a mi conocimiento, no está limitada por el estándar. Y como mencioné anteriormente, ninguno de los dos he visto una implementación con ese límite.

Cuestiones relacionadas