【发布时间】:2020-11-18 21:49:20
【问题描述】:
我正在尝试在 c 中创建一个函数来拆分字符串,就像 java 或许多其他语言中的拆分函数一样。 我做了这个
char **split(char * str, char *ch) {
char **array = (char **)malloc((strlen(str)) * sizeof(*array));
int i = 0;
char *token = strtok(str, ch);
while (token != NULL) {
array[i++] = token;
token = strtok(NULL, ch);
}
free(token);
return array;
}
这似乎有效,但并非总是有效且不正确。 假设我们以两种不同的方式调用它: 第一个工作:
int main(){
while(1){
sleep(1);
char h = ':';
char a[] = "test:1234";
char ** result = split(a,&h);
printf("%s\n",result[0]);
printf("%s\n",result[1]);
free(result);
}
}
而第二个在第二个循环中给我一个分段错误:
int main(){
char a[] = "test:1234";
char h = ':';
while(1){
sleep(1);
char ** result = split(a,&h);
printf("%s\n",result[0]);
printf("%s\n",result[1]);
free(result);
}
}
输出:
test
1234
test
Segmentation fault (core dumped)
我认为这是由于 strtok 函数对字符串索引进行了操作,但我不明白如何修复它以及它究竟为什么会给我一个分段错误。
【问题讨论】:
-
strtok modify 将空字符放入其中的字符串,你假设字符串没有变化,所以第二轮循环 while a 是 "test\01234" 并且 split 只找到一个结果,并且
result[1]在您打印时不会以未定义的行为进行初始化。另一个未定义的行为是您没有将 nulll 终止的字符串作为分隔符 -
free(token);应该做什么?
标签: c split segmentation-fault strtok