-1

我创建了下一个代码来获取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;
}
4

2 回答 2

6

这段代码:

char* finalResult = malloc(length);
strncat(finalResult, init,length);

会给你一个未定义的结果。您尝试与 连接finalResultinit即使您从未初始化finalResult。也许您打算使用strncpy()而不是strncat()

还有,finalResult不够大;它还需要包含终止\0字符,因此您应该将其分配给:

char* finalResult = malloc(length + 1);

此外,正如 Keith Thomson 所指出的,当你使用它时要当心危险。strncpy()

在这种特殊情况下,您可以strncpy()通过在分配后简单地初始化finalResult为空字符串来避免使用,然后strncat()像以前一样使用:

char* finalResult = malloc(length + 1);
finalResult[0] = '\0';
strncat(finalResult, init, length);

当然,您还应该检查malloc()内存不足错误的返回值,但这超出了您的问题范围。

于 2012-10-23T00:56:58.500 回答
0

来自男人 strlen:

The strlen() function calculates the length of the string s, not including the terminating '\0' character.

显然,您的 malloc 将需要为终止 '\0' 字符分配空间。所以修复很简单。在 malloc 中分配长度+1 个字节。

您的代码中存在第二个严重错误。Malloc 将返回未初始化的内存,但 strncat 将追加到现有字符串。因此,它将首先在未初始化的内存中搜索第一个'\0',这不是您想要的。所以 strncat 有效地依赖于 malloc 返回的第一个字节是 '\0'。您想改用 strncpy 。

修复了错误的代码:

char * end = strstr(init, "</div>");
if (end != NULL) {
    long length = strlen(init) - strlen(end);
    if (length > 0) {
        char * finalResult = malloc(length+1);
        strncpy(finalResult, init, length);
        printf("strlen(finalResult) = %ld, length = %ld\n", strlen(finalResult), length);
        free(finalResult);
    }
}
于 2012-10-23T01:20:40.650 回答