Problema con la concatenazione + itoa
Domanda
Ho il seguente codice:
char stringHour[50], stringMinute[50], stringSecond[50];
// lots of code...
itoa(hour, stringHour, 10);
itoa(minute, stringMinute, 10);
itoa(second, stringSecond, 10);
strcat(":", stringSecond);
strcat(":", stringMinute);
strcat(stringMinute, stringSecond);
// stringHour contains both HH and :SS:MM
strcat(stringHour, stringMinute);
drawText(HRES/2 - 4, VRES - GLYPH_HEIGHT*2,
stringHour, black);
hour
, minute
e second
sono tutti interi.
Quello che voglio fare è il tempo diplay la seguente: HH: MM: SS.
Le variabili sono garantiti per essere tra 0 e 59 (tranne hout, 0-24).
drawText è corretta.
Questo blocco di codice si blocca il mio programma, e non riesco a trovare sbagliato qualsiasi cosa con esso. Puoi?
Grazie per il vostro tempo!
Soluzione
Più che probabile il bit che sta fallendo è questo pezzo:
... stuff removed
strcat (":",
... other stuff removed
È quasi certamente non potete roba strcat
su un letterale di stringa sulla piattaforma che si sta utilizzando.
L'approccio strcat
ha overflow del buffer problemi di sicurezza come bene. Forse usando snprintf
potrebbe essere un'alternativa migliore?
Altri suggerimenti
Questo è sbagliato:
strcat(":", stringSecond);
Non è possibile utilizzare un valore letterale stringa per il primo argomento. Vedere strcat doc.
Inoltre, è meglio matrici init a zero.
char stringHour[50] = {0}, stringMinute[50] = {0}, stringSecond[50] = {0};
Quindi provare memorizzare il risultato del gatto in una stringa per vedere che cosa si arriva con.
Non è possibile modificare le stringhe letterali; uso char buffer[] = "MyLiteral"
invece e poi strcat()
a questo.
(La ragione di questo fatto è che il compilatore può ottimizzare la dimensione del codice attraverso il consolidamento di più istanze di tuoi letterali stringa in un caso in una sezione di sola lettura del file eseguibile, e quindi se si potrebbe cambiare un caso, che ci si cambiamento tutto il resto, che si tradurrebbe in un comportamento imprevedibile.)
Inoltre - il tuo strcat è in ordine inverso. strcat in realtà "concatena" - in modo da modificare l'ordine. strcat (stringHour, ":"); strcat (stringHour, stringMinute); strcat (stringHour, ":"); strcat (stringHour, stringSecond);
Tuttavia, questo è abbastanza terribile - perché non utilizzare sprintf? Inoltre - altre biblioteche, tranne per la costruzione di archi - eventualmente esaminare la BSL. La libreria standard C ha in realtà alcun controllo degli errori neanche per te -. Quindi è un germoglio in un piede, se non si sa esattamente cosa si sta facendo e cosa ci si aspetta dalla str * famiglia di funzioni