limite di dimensione specifica di conversione printf
-
09-10-2019 - |
Domanda
specifiche di conversione printf
sono %
seguita da bandiere, lunghezza, precisione modificatore di lunghezza e indicatore di conversione. C'è limite pratico alla dimensione di una specifica di conversione?
vale a dire. %s
è lungo 2 caratteri, mentre %08.2f
è lunga 6 caratteri. La mia domanda è, qual è la lunghezza massima della singola specifica in una stringa di formato che può essere creato, secondo la norma C99?
Soluzione
Non esiste una specifica di conversione di lunghezza massima. Se pensi di aver trovato una tale specifica, posso venire con uno che è un carattere più lungo.
Per esempio, si consideri larghezza del campo e precisione. Lo standard dice che sono interi decimali, ma non specifica la loro gamma. Pertanto è possibile scrivere gli indicatori di conversione con arbitrariamente grandi numeri interi come larghezza del campo o la precisione.
Altri suggerimenti
Se si intende una stringa letterale, è 4095 caratteri
5.2.4.1 limiti di traduzione
...
- 4095 caratteri in una stringa di caratteri letterali o larga letterale stringa (dopo la concatenazione)
...
Sono stato morso da limite C89 di 509 caratteri (non per le stringhe printf / scanf formato), quindi questo è uno dei buoni cambiamenti causati dal C99: -)
Modifica: implementazione glibc ( non Definizione standard )
glibc implementazione ottiene la larghezza da una funzione read_int
.
Così, per questa implementazione, a quanto pare, forse , il limite è di INT_MAX ( non ho cercato per la funzione read_int
).
specifiche di conversione printf sono% seguito da bandiere, lunghezza, precisione modificatore di lunghezza e indicatore di conversione. C'è limite pratico alla dimensione di una specifica di conversione?
Ho avuto a che fare in passato con diverse implementazioni printf
standard e la mia impressione generale che non v'è alcun limite imposto particolare.
La stringa di formato è generalmente carattere analizzato da carattere. (Pensate semplice FSM .) La maggior parte delle implementazioni printf
evitare il buffering nulla internamente ed anche per i numeri utilizzano il char dalla conversione da char a decimale (nemmeno atoi
).
È possibile controllare, ad esempio come il printf
è implementato all'interno del FreeBSD kernel (dove da molte altre implementazioni spesso sollevare il codice). Questo è sicuramente semplificato implementazione (con ritocchi paio kernel-specifici), eppure riflette come la stringa di formato viene spesso gestita.
NB. Appena controllato attuazione vfprintf()
di glibc e allocare internamente un buffer (se necessario) con malloc()
. Quindi limite né particolare lì.
La mia domanda è, che cosa è la lunghezza massima a singola specifica in una stringa di formato che può essere creato, secondo la norma C99?
L'identificatore di formato è una parte di una stringa e la stringa di lunghezza, a mia conoscenza non è limitata dalla norma. E come ho già detto in precedenza, non ho mai visto un'implementazione con tale termine.