C分割字符串函数

C分割字符串函数,c,windows,string,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) {

我试图实现分割字符串的函数,但我不断遇到分割错误。我正在使用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;
}

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

您的
strdup()
函数不正确。中的
sizeof(str)
str
指针的大小(可能是4或8个字节),而不是字符串的长度。请使用提供的库
\u strdup()

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

您没有计算空终止符,而是复制了错误的字节数

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

您没有计算空终止符,而是复制了错误的字节数

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

malloc
不会将分配的内存初始化为
\0
。您是否尝试过改用
calloc
?我怀疑seg故障是由于
res[I]!=空比较。

malloc
不会将分配的内存初始化为
\0
。您是否尝试过改用
calloc
?我怀疑seg故障是由于
res[I]!=空
比较。

此代码存在许多错误,但主要缺陷是试图实现此功能。它只会给你带来边际效益,如果有的话

比较以下两个代码段:

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

/*使用您的函数*/
字符**res=strspl(str、del和size);
尺寸i;
对于(i=0;i
此代码有很多错误,但主要缺陷是试图实现此功能。它只会给你带来边际效益,如果有的话

比较以下两个代码段:

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

/*使用您的函数*/
字符**res=strspl(str、del和size);
尺寸i;
对于(i=0;i
奇怪,我肯定windows有标准设置。您是否尝试过_strdup?有关Visual C++中
strdup
的(简短)故事,请参见以下链接:好的,strdup已被弃用_您现在应该使用的是strdup。您的strdup实现是错误的。
sizeof
运算符返回的是
char*
的大小,而不是代码所暗示的str的长度。它可以实现为
size\u t size=sizeof(*str)*(strlen(str)+1);char*res=malloc(大小);return(memcpy(res,str,size);
。至于segfault,我不知道,但是你的
strdup
实现是一个很好的开始。Windows API从Windows 2000开始提供。还有其他人提到的。帮你自己一个忙,然后调用
strlen(del)
仅一次。还要使所有参数
const char*
。并且,
strncmp
strtok
的行为完全不同,一个将多个字符视为一个单元,另一个将多个字符视为一组可选的单字符分隔符。奇怪的是,我确信windows有strdup。您尝试过strdup吗?请参阅以下链接以了解详细信息(简短)Visual C++中
strdup
的故事:好的,strdup被弃用了。\您现在应该使用的是strdup。您的strdup实现是错误的。
sizeof
操作符返回
char*
的大小,而不是您的代码似乎暗示的str的长度。它可以实现为
size\t size=sizeof(*str)*(strlen(str)+1);char*res=malloc(size);return(memcpy(res,str,size);
。至于segfault,我没有任何线索,但您的
strdup
实现是一个很好的开始。Windows API从Windows 2000开始就提供了。其他人也提到了这一点。请帮自己一个忙,然后调用
strlen(del)
仅一次。还要使所有参数
const char*
。并且,
strncmp
strok
的行为完全不同,一个将多个字符视为一个单元,另一个将作为一组可选的单字符分隔符。我明白了,所以我应该使用strlen(str)代替sizeof并再分配一个字节。非常感谢。为了绝对安全,您应该分配
strlen(str)*sizeof(char)+1
字节。@Adnan:我认为假设
sizeof(char)是安全的==1
。事实上,C99保证了这一点。但我同意,对于极端的可移植性,额外的预防措施从来都不是一个坏主意。我明白了,所以我应该使用strlen(str)而不是sizeof,并多分配一个字节。非常感谢。为了绝对安全,您应该分配
strlen(str)*sizeof(char+1
字节。@Adnan:我想说假设
sizeof(char)==1是安全的。事实上,C99保证了这一点。但我同意,对于极端的可移植性,额外的预防措施从来都不是一个坏主意。