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

hour,minute并且second都是整数。

我想要做的是显示时间如下:HH:MM:SS。

变量保证在 0 到 59 之间(除了 hout,0-24)。

drawText 是正确的。

这段代码使我的程序崩溃,我找不到任何问题。你可以吗?

谢谢你的时间!

4

5 回答 5

2

这是错误的:

strcat(":", stringSecond);

第一个参数不能使用字符串文字。请参阅strcat文档。

于 2011-01-01T17:29:00.550 回答
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()

(这一事实背后的原因是编译器可以通过将字符串文字的多个实例合并到可执行文件的只读部分中的一个实例中来优化代码大小,因此,如果您可以更改一个实例,那么您将更改其他所有内容,这将导致不可预测的行为。)

于 2011-01-01T17:27:03.600 回答
1

另外 - 你的 strcat 是相反的顺序。strcat 实际上“连接” - 所以改变顺序。strcat(stringHour, ":"); strcat(stringHour, stringMinute); strcat(stringHour, ":"); strcat(stringHour, stringSecond);

However, this is pretty terrible - why not use sprintf? Also - other libraries except for string building - possibly look into the BSL. The C standard library actually has no error checking for you either - so it's a shoot yourself in the foot, unless you know exactly what you're doing and what is expected from the str* family of functions.

于 2011-01-01T19:58:58.813 回答