我创建了下一个代码以获得char *,但是执行此代码后,finalResult的大小大于预期,并带有一些垃圾字符。为什么??我该如何解决?
//returns void
void processChar(){
//.... more stuff here
// init is a previous char*
char* end = strstr(init,"</div>");
if(end != NULL){
long length = strlen(init) - strlen(end);
if (length > 0){
char* finalResult = malloc(length);
strncat(finalResult, init,length);
//these lengths are different,being strlen(finalResult) > length
NSLog(@"%d %d",strlen(finalResult),length);
//... more stuff here
}
}
return;
}
最佳答案
这段代码:
char* finalResult = malloc(length);
strncat(finalResult, init,length);
会给你一个不确定的结果。您试图将
finalResult
与init
连接,即使您从未初始化finalResult
。也许您打算使用strncpy()
代替strncat()
?另外,
finalResult
还不够大。它也需要保留终止的\0
字符,因此您应该使用以下字符进行分配:char* finalResult = malloc(length + 1);
此外,正如Keith Thomson指出的那样,在使用dangers of
strncpy()
时要当心。在这种情况下,可以通过在分配后简单地将
strncpy()
初始化为空字符串来避免使用finalResult
,然后像以前一样使用strncat()
:char* finalResult = malloc(length + 1);
finalResult[0] = '\0';
strncat(finalResult, init, length);
当然,您还应该检查
malloc()
的返回值是否存在内存不足错误,但这不在您的问题范围内。