質問

次のコードがあります。

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 より良い代替手段になるでしょうか?

他のヒント

これは間違っています:

strcat(":", stringSecond);

最初の引数に文字通りの文字列を使用することはできません。見る strcat doc。

また、アレイをゼロに開始するのが最善です。

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*ファミリーから何が期待されているのかを正確に知らない限り、自分の撮影です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top