C - разбить строку на массив строк

Я не совсем уверен, как это сделать в C:

char* curToken = strtok(string, ";");
//curToken = "ls -l" we will say
//I need a array of strings containing "ls", "-l", and NULL for execvp()

Как мне это сделать?


person Jordan    schedule 25.06.2012    source источник
comment
Если вы хотите разделить на основе пробелов, почему вы указали ; в качестве разделителя?   -  person Oliver Charlesworth    schedule 26.06.2012
comment
Например: строка = ls -l; Дата; установить +v   -  person Jordan    schedule 26.06.2012


Ответы (2)


Поскольку вы уже рассмотрели strtok, просто продолжайте идти по тому же пути и разделите строку, используя пробел (' ') в качестве разделителя, затем используйте что-то вроде realloc, чтобы увеличить размер массива, содержащего элементы, которые будут переданы в execvp.

См. приведенный ниже пример, но имейте в виду, что strtok изменит переданную ему строку. Если вы не хотите, чтобы это произошло, вам необходимо сделать копию исходной строки, используя strcpy или аналогичную функцию.

char    str[]= "ls -l";
char ** res  = NULL;
char *  p    = strtok (str, " ");
int n_spaces = 0, i;


/* split string and append tokens to 'res' */

while (p) {
  res = realloc (res, sizeof (char*) * ++n_spaces);

  if (res == NULL)
    exit (-1); /* memory allocation failed */

  res[n_spaces-1] = p;

  p = strtok (NULL, " ");
}

/* realloc one extra element for the last NULL */

res = realloc (res, sizeof (char*) * (n_spaces+1));
res[n_spaces] = 0;

/* print the result */

for (i = 0; i < (n_spaces+1); ++i)
  printf ("res[%d] = %s\n", i, res[i]);

/* free the memory allocated */

free (res);

res[0] = ls
res[1] = -l
res[2] = (null)
person Filip Roséen - refp    schedule 25.06.2012
comment
@JordanCarney рад быть полезным. - person Filip Roséen - refp; 26.06.2012
comment
@FilipRoséen-refp Можете ли вы объяснить последний блок кода перед печатью и освобождением памяти: /* realloc one extra element for the last NULL */? мне трудно это понять - person Abdul; 16.10.2015
comment
@Abdul Я считаю, что обычно в конце каждого массива есть нулевой символ, чтобы компьютер мог различать два разных массива. - person Charles; 18.11.2015
comment
если я завершу это в функцию и верну указатель res, я получу предупреждение после освобождения указателя, которому я назначил res, говоря: warning: attempt to free a non-heap object [-Wfree-nonheap-object]. Есть ли у вас понимание причины? - person MattSom; 02.05.2020