我正在尝试实现拆分字符串的功能,但我不断收到分段错误。我正在使用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(),但仍然没有进展。
答案 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). */
}