C分割字符串功能

时间:2011-07-01 00:05:01

标签: c windows string

我正在尝试实现拆分字符串的功能,但我不断收到分段错误。我正在使用Windows XP,因此我还必须实现strdup(),因为Windows API不提供它。任何人都可以告诉我下面这段代码有什么问题。

char** strspl(char* str, char* del)
{
    int size = 1;

    for(int i = 0; i < strlen(str);) {
        if(strncmp(str + i, del, strlen(del)) == 0) {
            size++;
            i += strlen(del);
        }
        else {
            i++;
        }
    }
    char** res = (char**)malloc(size * sizeof(char*));
    res[0] = strdup(strtok(str, del));
    for(int i = 0; res[i] != NULL; i++) {
        res[i] = strdup(strtok(NULL, del));
    }
    return res;
}

char* strdup(char* str) {
    char* res = (char*)malloc(strlen(str));
    strncpy(res, str, sizeof(str));
    return res;
}

编辑:使用我发现的调试器,该程序在以下行后崩溃:

res[0] = strdup(strtok(str,del));

另外,我修复了strdup(),但仍然没有进展。

4 个答案:

答案 0 :(得分:1)

您没有计算空终止符,并且您正在复制错误的字节数

char* strdup(char* str) {
    char* res = (char*)malloc(strlen(str)); /* what about the null terminator? */
    strncpy(res, str, sizeof(str)); /* sizeof(str)
                                    ** is the same as
                                    ** sizeof (char*) */
    return res;
}

答案 1 :(得分:0)

您的strdup()功能不正确。 sizeof(str)中的str_strdup()指针的大小(可能是4或8个字节),而不是字符串的长度。请改用{{1}}提供的库。

答案 2 :(得分:0)

malloc未将分配的内存初始化为\0。您是否尝试过使用calloc?我怀疑seg故障是由res[i] != NULL比较引起的。

答案 3 :(得分:0)

此代码存在许多问题,但主要缺陷是尝试实现此功能。它只会为您提供边际利益,如果有的话。

比较以下两个代码段:

/* Using strtok... */
char *tok = strtok(str, del);
while (tok != NULL) {
    /* Do something with tok. */
    tok = strtok(NULL, del);
}

-

/* Using your function... */
char **res = strspl(str, del, &size);
size_t i;
for (i = 0; i < size; i++) {
    /* Do something with *(res + i). */
}