要在strcat之后使用时钟函数产生毫秒,但它只是崩溃,那可能是什么问题?
FREObject result = 0;
uint32_t len = -1;
const uint8_t *str = 0;
char *temp = "Millisecond: ";
uint8_t *strAll;
clock_t curtime = clock();
double *asc = (double *) curtime; //Using double datatype?
if(FREGetObjectAsUTF8(argv[0], &len, &str) == FRE_OK) {
strAll = (char *)malloc(strlen(temp) + strlen(str) + 1 + strlen(asc) + 1);
strcpy(strAll,temp);
strcat(strAll,str);
strcat(strAll," ");
strcat(strAll,(char *)asc); //Is this correct?
}
FRENewObjectFromUTF8(strlen((const char *)strAll)+1, (const uint8_t *)strAll, &result);
return result;
答案 0 :(得分:2)
对asc
的转让非常可疑:
double *asc = (double *) curtime; //Using double datatype?
您可以测量两个clock()
值之间的差异,以确定使用的处理器时间。
您可能会获得更接近成功的结果:
double asc = curtime;
strlen()
操作未定义 - 在asc
的任何定义下:
strAll = (char *)malloc(strlen(temp) + strlen(str) + 1 + strlen(asc) + 1);
然后strcat()
操作失败了;在将字符串连接到另一个字符串之前,必须将double
转换为字符串。
strcat(strAll,(char *)asc); //Is this correct?
所以,你有很多工作要做。您需要确定clock()
是否是正确的系统调用。如果是,则必须先修改大小调整以及将asc
或curtime
转换为字符串,然后再将其连接到结果。
答案 1 :(得分:2)
Jonathan Leffler的回答概述了在代码运行之前需要解决的一些问题。如果你还没有,你应该给他一个upvote:)
在您当前的代码中,代码中的转换为(char*)
告诉编译器将asc
存储的内存视为char*
,但它不会做为你转换为字符串。
要将double
转换为字符串,请查看sprintf()
。我会用这个替换strcat行:
sprintf(strAll,"%s%s %f",temp,str,asc);
请注意,您首先需要确保strAll
足够大以包含结果字符串。这对于double
来说可能有点棘手。但是,我并不认为你有double
- clock_t
可能是long
,这意味着你可以这样做:
long asc = (long) curtime;
...
strAll = malloc(strlen(temp) + strlen(str) + 1 + (asc/10 +1) + 1);
sprintf(strAll,"%s%s %ld",temp,str,asc);
警告:asc/10 +1
仅告诉您需要为非负数分配多少个字符。由于时钟被记录为在错误情况下返回负数,因此您应首先检查它。
请注意,我还将广告素材移至char*
since it can cause problems in C(感谢匿名评论者)。
另外:目前malloc的结果没有检查错误 - 如果出错,它将返回NULL
,这将破坏使用strAll
的尝试。因此,在尝试使用它之前确保它不是NULL
是一个好主意。