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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top