0

次のコードがあります。

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);

hourminuteおよびsecondすべて int です。

私がやりたいのは、HH:MM:SS のように時刻を表示することです。

変数は、0 から 59 の間であることが保証されています (hout を除く、0 から 24)。

drawTextは正しいです。

このコード ブロックによってプログラムがクラッシュしますが、問題は見つかりません。あなたはできる?

御時間ありがとうございます!

4

5 に答える 5

2

これは間違っています:

strcat(":", stringSecond);

最初の引数に文字列リテラルを使用することはできません。strcatのドキュメントを参照してください。

于 2011-01-01T17:29:00.550 に答える
1

また、あなたの strcat は逆順です。strcat は実際には「連結」するため、順序を変更してください。strcat(stringHour, ":"); strcat(stringHour, stringMinute); strcat(stringHour, ":"); strcat(stringHour, stringSecond);

しかし、これはかなりひどいものです。なぜ sprintf を使用しないのでしょうか? また、ストリング構築以外の他のライブラリーは、おそらく BSL を調べてください。C 標準ライブラリには、実際にはエラー チェック機能もありません。つまり、自分が何をしていて、str* ファミリの関数から何が期待されているかを正確に把握していない限り、自分自身を撃つことになります。

于 2011-01-01T19:58:58.813 に答える
1

また、配列をゼロに初期化することをお勧めします。

char stringHour[50] = {0}, stringMinute[50] = {0}, stringSecond[50] = {0};

次に、cat の結果を文字列に格納して、結果を確認してください。

于 2011-01-01T17:23:19.887 に答える
1

おそらく失敗しているビットはこの作品です:

... stuff removed
strcat (":", 
... other stuff removed

使用しているプラ​​ットフォームでは、ほぼ確実strcatに文字列リテラルに詰め込むことはできません。

このstrcatアプローチには、バッファ オーバーフローの安全性の問題もあります。多分使用snprintfすることはより良い代替手段かもしれませんか?

于 2011-01-01T17:25:32.077 に答える
1

文字列リテラルは変更できません。char buffer[] = "MyLiteral"代わりに使用してから、それstrcat()を使用します。

(この事実の背後にある理由は、コンパイラが文字列リテラルの複数のインスタンスを実行可能ファイルの読み取り専用セクションの 1 つのインスタンスに統合することでコード サイズを最適化できるため、1 つのインスタンスを変更できれば、他のすべてを変更することになります。 、予期しない動作が発生する可能性があります。)

于 2011-01-01T17:27:03.600 に答える