Сделайте снимок:
#include <stdlib.h>
#include <string.h>
...
void split(char *str, char **splitstr)
{
char *p;
int i=0;
p = strtok(str,",");
while(p!= NULL)
{
printf("%s", p);
splitsr[i] = malloc(strlen(p) + 1);
if (splitstr[i])
strcpy(splitstr[i], p);
i++;
p = strtok (NULL, ",");
}
}
А затем, в main
:
#define MAX_LEN ... // max allowed length of input string, including 0 terminator
#define MAX_STR ... // max allowed number of substrings in input string
int main(void)
{
char input[MAX_LEN];
char *strs[MAX_STR] = {NULL};
...
split(input, strs);
...
}
Некоторые объяснения.
strs
определяется в main
как массив указателей на char
.Каждый элемент массива будет указывать на строку, извлеченную из входной строки.В общем, все, что выделено, это массив указателей, каждый элемент изначально равен NULL;память для каждого элемента будет выделена в функции split
с использованием malloc
в зависимости от длины подстроки. Где-то после того, как вы закончили с strs
, вам нужно будет освободить эти указатели, используя free
:
for (i = 0; i < MAX_STR; i++)
free(strs[i]);
Теперь, почему splitstr
объявлен как char **
вместоchar *[MAX_STR]
?За исключением случаев, когда он является операндом операторов sizeof
или &
или является строковым литералом, используемым для инициализации другого массива в объявлении, тип выражения массива будет неявно преобразован из N-element array of T
в pointer to T
,и значением выражения будет расположение первого элемента в массиве.
Когда мы вызываем split
:
split(input, strs);
, выражение массива input
неявно преобразуется извведите char [MAX_LENGTH]
в char *
(T == char
), а выражение массива strs
неявно преобразуется из типа char *[MAX_STRS]
в char **
(T == char *
).Таким образом, splitstr
получает значения указателя для двух параметров, в отличие от значений массива.