Problem mit Verkettung + itoa
Frage
Ich habe den folgenden Code:
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
und second
sind alle ints.
Was ich tun möchte, ist die Diplay -Zeit wie folgt: HH: MM: SS.
Die Variablen liegen garantiert zwischen 0 und 59 (außer Hout, 0-24).
DrawText ist korrekt.
Dieser Codeblock stürzt mein Programm ab, und ich kann nichts falsch daran finden. Können Sie?
Vielen Dank für Ihre Zeit!
Lösung
Mehr als wahrscheinlich ist das Bit, das fehlschlägt, dieses Stück:
... stuff removed
strcat (":",
... other stuff removed
Sie können mit ziemlicher Sicherheit nicht können strcat
Sachen auf einer Saitenliteral auf der Plattform, die Sie verwenden.
Das strcat
Der Ansatz hat auch Probleme mit dem Pufferüberlauf. Vielleicht benutze snprintf
Könnte eine bessere Alternative sein?
Andere Tipps
Das ist falsch:
strcat(":", stringSecond);
Für das erste Argument können Sie keine Saitenliteral verwenden. Sehen Strcat Dokument.
Außerdem ist es am besten, Arrays auf Null zu initieren.
char stringHour[50] = {0}, stringMinute[50] = {0}, stringSecond[50] = {0};
Versuchen Sie dann, das Ergebnis der Katze in eine Schnur zu speichern, um zu sehen, was Sie sich einfallen lassen.
Sie können keine String -Literale ändern. verwenden char buffer[] = "MyLiteral"
Stattdessen und dann strcat()
dazu.
(Der Grund dafür ist, dass der Compiler die Codegröße optimieren kann, indem sie mehrere Instanzen Ihrer String-Literale in einer Instanz in einem schreibgeschützten Abschnitt der ausführbaren Datei konsolidieren. Wenn Sie also eine Instanz ändern können, würden Sie alles andere ändern , was zu unvorhersehbarem Verhalten führen würde.)
Auch - Ihr Strcat ist in umgekehrter Reihenfolge. STRCAT "verkettet" tatsächlich - ändern Sie also die Reihenfolge. Strcat (StringHour, ":"); Strcat (StringHour, StringMinute); Strcat (StringHour, ":"); Strcat (StringHour, Stringsecond);
Das ist jedoch ziemlich schrecklich - warum nicht Sprintf verwenden? Auch - andere Bibliotheken mit Ausnahme von String Building - schauen Sie möglicherweise in die BSL. Die C -Standardbibliothek hat auch keinen Fehler, der Sie auch für Sie überprüft. Sie ist also ein Shooting selbst im Fuß, es sei denn, Sie wissen genau, was Sie tun und was von der STR* -Funktion von Funktionen erwartet wird.