多次运行此函数会导致分段错误,我无法弄清楚原因。我不是在寻找拆分字符串的替代方法。
SplitX将继续拆分x ammount分隔符(无论是'|'还是'\ 0')并返回x或它可以产生的子串数。
我应该注意到,经过3年的简单JavaScript和PHP,我刚刚重新启动了C编码,所以我可能会遗漏一些明显的东西。
int splitX(char **array, char *string, int x) {
int y;
int z;
int index = 0;
int windex = 0;
for(y = 0; y < x; y++) {
z = index;
while(string[index] != '\0' && string[index] != '|') {
index++;
}
char **tempPtr = realloc(array, (y+1)*sizeof(char *));
if(tempPtr == NULL) {
free(array);
return -3;
}
array = tempPtr;
array[y] = malloc(sizeof(char) * (index - z + 1));
windex = 0;
for(; z < index; z++) {
array[y][windex] = string[z];
windex++;
}
array[y][windex] = '\0';
if(string[index] == '\0')
break;
index++;
}
return y+1;
}
int main() {
char **array;
int array_len = splitX(array, query, 2);
printf("%s %s %d\n", array[0], array[1], array_len);
while(array_len > 0) {
free(array[array_len-1]);
array_len--;
}
free(array);
array_len = splitX(array, "1|2\0", 2);
printf("%s %s %d\n", array[0], array[1], array_len);
while(array_len > 0) {
free(array[array_len-1]);
array_len--;
}
free(array);
}
答案 0 :(得分:4)
char **array;
int array_len = splitX(array, query, 2);
这使得splitX()
可以使用未初始化的array
,从而导致未定义的行为。
此外,当你写
时,C没有传递参考 array = tempPtr;
在函数内部,在其外部没有可见效果。
我不是在寻找拆分字符串的替代方法。
你应该真的。您当前的方法充其量只是非惯用的,但它也有一些其他错误(例如因y + 1
确实会出现某些原因而返回y
等等)。
您也在重新发明轮子:对于字符串和字符搜索,请使用C标准库中的strstr()
,strchr()
和strtok_r()
;对于复制字符串,请使用strdup()
而不是手动浏览字符串等等...
还有什么:
使用size_t
代替int
;
使用const char *
作为输入字符串来维护const正确性。
char **split(const char *s, size_t *sz)
{
char **r = NULL;
size_t n = 0, allocsz = 0;
const char *p = s, *t = p;
int end = 0;
do {
const char *tmp = strchr(p, '|');
if (tmp == NULL) {
p = p + strlen(p);
end = 1;
} else {
p = tmp;
}
if (++n > allocsz) {
if (allocsz == 0)
allocsz = 4;
else
allocsz <<= 1;
char **tmp = realloc(r, sizeof(*r) * allocsz);
if (!tmp) abort(); // or whatever, handle error
r = tmp;
}
r[n - 1] = malloc(p - t + 1);
memcpy(r[n - 1], t, p - t);
r[n - 1][p - t] = 0;
p++;
t = p;
} while (!end);
*sz = n;
return r;
}