您的代码存在许多问题,但最重要的是动态分配。您的代码不会为保存字符串数组(也就是char数组的数组)分配内存。
这一行:
arr = malloc(sizeof(**arr) * (strlen(s) + 2));
分配内存以保存多个指针(即 strlen(s) + 2 指针)但没有任何用于保存字符的内存。
strlen(s) + 2
您可以使用的一种简单方法是分配一个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
arr[i][j] = SOME_CHARACTER;
的 没有段错误 强> 。 (这是必要的原因 i 和 j 在分配的范围内)。
i
j
内部while循环需要结束if s[i] 是 NULL : while (s[i] != c && s[i] != '\0')
s[i]
NULL
while (s[i] != c && s[i] != '\0')
你检查一下 s[i + 1] 在你的 if 声明,但你继续循环。
s[i + 1]
if
你也分配了比必要更多的字节,你可以有一个相同大小的输入字符串的缓冲区,当找到分隔符或NULL时,你在你需要大小的数组中分配一个新行并将缓冲区复制到其中。