c-为什么strtok会导致我的程序出现segfault



我正在尝试构建一个函数,该函数接收两个数字字符串(如charstrArr[2] = {"1, 2, 3, 4, 5", "4, 5, 6, 7, 8"}(并对其进行解析。在编写函数时,我遇到了一个seg错误,我已经确定了seg错误的确切行,并省略了该行之后的所有内容。

有问题的行是一个strtok调用,它接收了第一个字符串和一个分隔符。有人知道发生了什么吗?

有问题的代码:

void FindIntersection(char * strArr[]) { 
int nel1 = 1;
int nel2 = 1;
int i = 0;
/*Determine the number of elements in strArr[0] */
while(strArr[0][i] != ''){
if(strArr[0][i] == ','){
nel1++;
}
i++;
}
i = 0;
/* Determine the number of elements in strArr[1] */
while(strArr[1][i] != ''){
if(strArr[1][i] == ','){
nel2++;
}
i++;
}
int intArr1[nel1];
int intArr2[nel2];
/* parse the elements from each char array and place them in int arrays */
char delim[2] = ", ";   
char *token;
token = strtok(strArr[0], delim);
char strArr[2] = {"1, 2, 3, 4, 5", "4, 5, 6, 7, 8"};

如果这是实际的代码,那就不起作用了——它会创建一个char数组,而不是char指针的数组


如果你拥有的实际上是char *strArr ...(一个指针数组(,那也不起作用。修改字符串文字是一种未定义的行为,strtok通常就是这样编织它的魔力的。


为了解决这个问题(假设你已经这样做了(,你可以按照以下片段使用相同的技巧:

char *x = "123";  // a pointer to string literal you should not modify.
char x[] = "123"; // a string array you can modify.

换句话说,您可以创建一个多维字符数组,而不是指向不可修改字符串文字的一维字符指针数组。

下面使用此方法为您提供了一组可修改的字符串,不过您需要注意第二个维度是否足够大,以容纳将用于初始化数组的所有文字(足够容纳所有字符加上一个用于字符串终止符(:

char strArr[][14] = {"1, 2, 3, 4, 5", "4, 5, 6, 7, 8"}

这也意味着,如果你有一个大字符串和许多小字符串,每个字符串都会分配最大大小,那么空间可能会被浪费。


如果你想避免指定第二个维度的大小和可能带来的浪费,你可以(正如rici在评论中指出的那样(使用复合文字来初始化char指针数组元素,使它们可写:

char *strArr[] = {
(char[]){"1, 2, 3, 4, 5"},
(char[]){"4, 5, 6, 7, 8"},
};

相关内容

  • 没有找到相关文章

最新更新