Lunghezza della stringa di carbone e perdita di memoria
-
28-10-2019 - |
Domanda
int fCount = 0;
char frameNum[7];
sprintf(frameNum, %06u", fCount);
int fCount = 0;
char frameNum[6];
sprintf(frameNum, %06u", fCount);
Q1. Quale è corretto, 6 o 7?
Q2. Sto usando VC6 e il file è sample.cpp.
Penso che Sprintf sia C. c'è un modo migliore? Ho bisogno della stringa char destra giustificata e con zeri imbottiti.
Per favore, non dirmi di usare un compilatore più recente. Ho bisogno di usare VC6 per ora.
Soluzione
Il primo è corretto. A proposito, non c'è perdita di memoria.
--
Penso che Sprintf sia C. c'è un modo migliore?
Sì. Way C ++:
std::stringstream ss; //#include <sstream>
ss << fCount;
std::string frameNum = ss.str();
Altri suggerimenti
7, poiché Sprintf aggiungerà un byte nullo ' 0' alla fine della stringa.
Nessuno dei due sarà una perdita di memoria: i dati sono sullo stack!
Q1. Quale è corretto, 6 o 7?
Né. Il 6 nella stringa di formato è un minimo larghezza, quindi 7 caratteri non saranno sufficienti se fCount >= 1000000
. La dimensione più piccola che non traboccerà per qualsiasi input è std::numeric_limits<int>::digits10 + 2
(Per consentire tutte le cifre decimali, il carattere terminale e il segno se l'ingresso è negativo). Supponendo che VC6 fornisca <numeric_limits>
; altrimenti sizeof(int)*3 + 2
è un limite superiore ragionevole. Se vuoi essere sicuro, chiama snprintf
e controlla il valore di ritorno.
Q2. Sto usando VC6 e il file è sample.cpp. Penso che Sprintf sia C. c'è un modo migliore? Ho bisogno della stringa char destra giustificata e con zeri imbottiti.
Nella maggior parte dei casi stai meglio usando stringhe e flussi C ++, che gestiscono la propria memoria e non traboccano a meno che tu non faccia qualcosa di molto strano.
std::ostringstream s;
s << setw(6) << setfill('0') << fCount;
std::string frameNum = s.str();
Sono abbastanza sicuro che VC6 li supporti, ma è passato più di un decennio da quando ho avuto la sfortuna di combattere con quel compilatore, e ho fatto del mio meglio per dimenticare esattamente quanto fosse limitato. So che mi hai chiesto di non farlo, ma dirò: usa un compilatore più nuovo. La lingua è cambiata molto negli ultimi 15 anni.