2010-10-20 9 views
6

printf le specifiche di conversione sono % seguite da flag, larghezza, precisione, modificatore di lunghezza e identificatore di conversione. C'è un limite pratico alle dimensioni di una specifica di conversione?limite di dimensioni della specifica di conversione printf

I.e. %s è lungo 2 caratteri, mentre %08.2f è lungo 6 caratteri. La mia domanda è, qual è la lunghezza della singola specifica massima in una stringa di formato che può essere creata, secondo lo standard C99?

+0

Ah, capisco, sei solo interessato ai limiti pratici su una specifica di singolo formato di una stringa di formato. Allora elimino la mia risposta. –

+0

Sono curioso - c'è qualche ragione per cui vuoi sapere oltre alla curiosità? – nategoose

+0

@nategoose: sto considerando un wrapper molto speciale su 'snprintf' e voglio capire se posso allocare staticamente dei buffer temporanei – zaharpopov

risposta

2

Non esiste una specifica di conversione della lunghezza massima. Se pensi di aver trovato una tale specifica, posso inventarne una che è più lunga.

Ad esempio, considerare larghezza e precisione del campo. Lo standard dice che sono interi decimali ma non specifica il loro intervallo. Pertanto è possibile scrivere gli specificatori di conversione con numeri interi arbitrariamente grandi come larghezza o precisione del campo.

+0

per questo motivo è stato chiesto "pratico" in questione, dopo che tutta questa larghezza è limitata ei valori di grandi dimensioni non sono validi. anche se 64-bit, è praticamente limitato – zaharpopov

+1

Mentre 'printf' probabilmente non impone alcun limite (e non è obbligatorio), il fatto che' printf' restituisca il numero di caratteri stampati significa che non verrà specificato/non definito (non chiaro quale) comportamento se si utilizzano larghezze/precisioni del campo di dimensioni follemente elevate. Un motivo più realistico per cui lo specificatore di formato potrebbe essere illimitato è costituito da flag ridondanti, ad es. 'D' +++++++++++++++++++++++%. –

+0

@zaharpopov: Beh, ci sono due approcci nella domanda 1) pratico 2) secondo lo standard. Ho preso il secondo approccio. Il primo dipende dall'implementazione del compilatore e della libreria. – laalto

1

Se si intende una stringa letterale, è 4095 caratteri

5.2.4.1 limiti di traduzione
...
- 4095 caratteri in una stringa di caratteri stringa letterale o larga letterale (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 apportati il by C99 :-)


Edit: implementazione glibc (non Definizione standard)

implementazione glibc ottiene la larghezza da una funzione read_int.
Così, per questa implementazione, a quanto pare, forse, il limite è di INT_MAX (non ho cercato la funzione di read_int).

+1

sì, ma questa non è la mia domanda. il formato potrebbe non essere un valore letterale - la mia domanda riguarda la lunghezza dello specificatore massimo dopo '%' – zaharpopov

1

le specifiche di conversione printf sono% seguite da flag, larghezza, precisione, modificatore di lunghezza e identificatore di conversione. C'è un limite pratico alle dimensioni di una specifica di conversione?

Ho dovuto occuparmi in passato di diverse implementazioni standard printf e la mia impressione generale che non ci sia un limite particolare imposto.

La stringa di formato viene generalmente analizzata carattere per carattere. (Pensa semplicemente a FSM.) La maggior parte delle implementazioni printf evita il buffering di qualsiasi cosa internamente e anche per i numeri usa la conversione char in char in decimale (nemmeno atoi).

È possibile controllare ad esempio come lo printf è implementato all'interno dello FreeBSD kernel (dove da molte altre implementazioni spesso si solleva il codice). Questa è sicuramente un'implementazione semplificata (con un paio di modifiche specifiche del kernel), ma riflette il modo in cui viene spesso gestita la stringa di formato.

N.B.Ho appena controllato l'implementazione di glibc vfprintf() e allocano internamente un buffer (se necessario) con malloc(). Quindi nessun limite particolare lì.

La mia domanda è, qual è la lunghezza della specifica singola massima in una stringa di formato che può essere creata, secondo lo standard C99?

L'identificatore di formato è una parte di una stringa e la lunghezza della stringa a mia conoscenza non è limitata dallo standard. E come ho detto sopra, non ho mai visto un'implementazione con un limite del genere.

Problemi correlati