我的目标是创建一个函数,该函数将字符串转换为由定界符分配初始字符串而产生的"单词"数组。所有单词都应终止终止。例如: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] != ' ')
{
j = 0;
while (s[i] != c)
{
arr[k][j] = s[i];
if (s[i + 1] == c || s[i + 1] == ' ')
{
j++;
arr[k][j] = ' ';
k++;
}
i++;
j++;
}
j = 0;
while (s[i] == c)
i++;
}
arr[k] = 0;
return (arr);
}
它仅与空字符串和其他所有内容一起使用。我相信问题在这里。
arr[k][j] = s[i];
,但我不明白问题是什么。预先感谢
您的代码有许多问题,但最重要的是动态分配。您的代码不会分配存储器来保存一系列字符串(也就是char数组的数组)。
这一行:
arr = malloc(sizeof(**arr) * (strlen(s) + 2));
分配内存以保存数字字符(即strlen(s) + 2
字符),但这不是您想要的。尤其不是当arr
是指向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;
没有segfaults 。(是原因,i
和j
在分配的范围内)。
如果 s[i]
是 NULL
: while (s[i] != c && s[i] != ' ')
您在if
语句中检查s[i + 1]
,但您继续循环。
您还要分配更多的字节,而不是必要的,您可以具有相同大小的输入字符串的缓冲区,当找到分隔符或空的null时,您在所需尺寸的数组中分配一个新行,然后复制缓冲区。