質問
次のコードがあります。
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
そして second
すべて整数です。
私がやりたいのは、次のように表示時間を設定することです。時:MM:SS。
変数は 0 ~ 59 の範囲であることが保証されます (hout、0 ~ 24 を除く)。
ドローテキストは正しいです。
このコード ブロックはプログラムをクラッシュさせますが、問題は見つかりませんでした。あなたはできる?
御時間ありがとうございます!
解決
おそらく失敗している部分は次の部分です。
... stuff removed
strcat (":",
... other stuff removed
ほぼ確実にできない strcat
使用しているプラットフォーム上の文字列リテラルに代入します。
の strcat
このアプローチにはバッファ オーバーフローの安全性の問題もあります。たぶん使ってる snprintf
より良い代替手段になるでしょうか?
他のヒント
また、アレイをゼロに開始するのが最善です。
char stringHour[50] = {0}, stringMinute[50] = {0}, stringSecond[50] = {0};
次に、猫の結果をひもに保存して、あなたが思いついたものを確認してみてください。
文字列リテラルを変更することはできません。使用する char buffer[] = "MyLiteral"
代わりに、そして strcat()
それに。
(この事実の背後にある理由は、コンパイラが列のリテラルの複数のインスタンスを実行可能ファイルの読み取り専用セクションで1つのインスタンスに統合することにより、コードサイズを最適化できるため、1つのインスタンスを変更できれば、他のすべてを変更できます。 、予測不可能な行動をもたらすでしょう。)
また、あなたのstrcatは逆順序です。 STRCATは実際に「連結」 - 順序を変更します。 strcat(stringhour、 ":"); strcat(stringhour、stringminute); strcat(stringhour、 ":"); strcat(stringhour、stringsecond);
しかし、これはかなりひどいです - なぜsprintfを使用してみませんか?また、文字列の構築を除く他のライブラリ - おそらくBSLを調べてください。 C標準ライブラリには実際にもエラーチェックがありません。したがって、自分が何をしているのか、機能のstr*ファミリーから何が期待されているのかを正確に知らない限り、自分の撮影です。