我的目标是创建一个函数,该函数将字符串转换为由定界符分割初始字符串而得到的“单词”数组。所有单词都应以空值结尾。 例如:strtoarr(“ ** hello *** world *”,“ *”)应生成{“ hello”,“ world”}。这是我的功能。
char **strtoarr(char const *s, char c)
{
char **arr;
size_t i;
size_t j;
size_t k;
arr = malloc(sizeof(**arr) * (strlen(s) + 2));
if (arr == 0)
return (NULL);
i = 0;
k = 0;
while (s[i] != '\0')
{
j = 0;
while (s[i] != c)
{
arr[k][j] = s[i];
if (s[i + 1] == c || s[i + 1] == '\0')
{
j++;
arr[k][j] = '\0';
k++;
}
i++;
j++;
}
j = 0;
while (s[i] == c)
i++;
}
arr[k] = 0;
return (arr);
}
它仅适用于空字符串和段错误。我相信问题就在这里。
arr[k][j] = s[i];
但是我不明白问题是什么。 预先感谢
答案 0 :(得分:2)
您的代码有很多问题,但最重要的是动态分配。您的代码没有分配用于保存字符串数组(也就是char数组的数组)的内存。
此行:
arr = malloc(sizeof(**arr) * (strlen(s) + 2));
分配用于保存数字字符(即strlen(s) + 2
字符)的内存,但这不是您想要的。尤其是当arr
是指向char的指针时。
您可以使用的一种简单方法是分配一个char指针数组,然后为每个这些指针分配一个char数组。
这将是:
char** arr = malloc(sizeof(*arr) * NUMBER_OF_WORDS_IN_INPUT);
arr[0] = malloc(NUMBER_OF_CHARACTERS_IN_WORD0 + 1);
arr[1] = malloc(NUMBER_OF_CHARACTERS_IN_WORD1 + 1);
...
arr[NUMBER_OF_WORDS_IN_INPUT - 1] = malloc(NUMBER_OF_CHARACTERS_IN_LAST_WORD + 1);
然后您可以使用语法将字符存储到arr
arr[i][j] = SOME_CHARACTER;
无段错误。 (这是有原因的,要求i
和j
在分配范围之内。)
答案 1 :(得分:0)
如果s[i]
为NULL
:while (s[i] != c && s[i] != '\0')
您在s[i + 1]
语句中检查if
,但继续循环。
另外,您分配的字节数超出了必要,您可能拥有与输入字符串相同大小的缓冲区,并且当找到定界符或NULL时,您将在数组中分配所需大小的新行并复制缓冲到里面。