Pregunta

especificaciones de conversión printf son % seguido de banderas, 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?

es decir. %s es de 2 caracteres de largo, mientras que %08.2f es de 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, según la norma C99?

¿Fue útil?

Solución

No hay tal especificación de conversión de longitud máxima. Si usted piensa que ha encontrado una especificación tal, puedo llegar a uno que sea con un carácter más tiempo.

Por ejemplo, considere la anchura del campo y precisión. La norma dice que son enteros decimales, pero no especifica su rango. Por lo tanto se puede escribir con especificadores de conversión arbitrariamente grandes números enteros como la anchura del campo o de precisión.

Otros consejos

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

5.2.4.1 límites Traducción
...
- 4095 caracteres en un literal de cadena de caracteres o literal de cadena ancha (después de la concatenación)
...

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


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

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

especificaciones de conversión printf son% seguido por banderas, 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?

he tenido que hacer frente en el pasado con varias implementaciones printf estándar y mi impresión general de que no hay límite particular impuesta.

El formato de cadena en general, es el carácter analizado por carácter. (Piense sencilla FSM .) La mayoría de las implementaciones printf evitar el almacenamiento nada internamente e incluso para los números utilizan el Char por conversión char a decimal (ni siquiera atoi).

Puede comprobar, por ejemplo, cómo se implementa el printf dentro de la kernel de FreeBSD (donde de muchas otras implementaciones menudo levantar el código). Que seguramente se simplifica la implementación (con ajustes par kernel-específicas), sin embargo, refleja cómo la cadena de formato a menudo se maneja.

N.B. Acaba de comprobar la ejecución vfprintf() de glibc y asignar un buffer interno (si es necesario) con malloc(). límite por lo que tampoco existe en particular.

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

El especificador de formato es una parte de una cadena y cadena de longitud que yo sepa, no está limitado por la norma. Y como he mencionado anteriormente, no he visto nunca una implementación con cualquier límite.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top