Determinazione della dimensione del buffer sprintf:qual è lo standard?

Determinazione della dimensione del buffer sprintf:qual è lo standard?


Quando si converte un int in questo modo:


char a[256];
sprintf(a, "%d", 132);

qual è il modo migliore per determinare quanto è grande a dovrebbe essere? Presumo che l'impostazione manuale vada bene (come l'ho visto usato ovunque), ma quanto dovrebbe essere grande? Qual è il valore int più grande possibile su un sistema a 32 bit e c'è un modo complicato per determinarlo al volo?


Risposte:


Il numero massimo possibile di bit in un int è CHAR_BIT * sizeof(int) e una cifra decimale "vale" almeno 3 bit, quindi un limite superiore libero nello spazio richiesto per un int arbitrario è (CHAR_BIT * sizeof(int) / 3) + 3 . Quel +3 è uno per il fatto che abbiamo arrotondato per difetto quando abbiamo diviso, uno per il segno, uno per il terminatore nullo.


Se per "su un sistema a 32 bit" intendi che conosci int è 32 bit, quindi sono necessari 12 byte. 10 per le cifre, una per il segno, una per il terminatore nullo.


Nel tuo caso specifico, dove l'int da convertire è 132 , hai bisogno di 4 byte. Badum, tish.


Laddove i buffer di dimensione fissa possono essere utilizzati con un limite ragionevole, sono l'opzione più semplice. Non molto umilmente sostengo che il limite sopra è ragionevole (13 byte invece di 12 per 32 bit int e 23 byte invece di 21 per int a 64 bit ). Ma per i casi difficili, in C99 potresti semplicemente chiamare snprintf per ottenere la taglia, quindi malloc così tanto. È eccessivo per un caso così semplice.