Токенизация массива строк в c - PullRequest
0 голосов
/ 12 ноября 2018

Я новичок в программировании и на всю жизнь я не могу понять эту проблему.Я пытаюсь создать функцию, которая токенизирует строку, используя пробел в качестве разделителя и указатель на строку и количество токенов в качестве параметра.Функция должна возвращать массив символов с символьной строкой Ex.превращение "(2 + (5 - 3))" в {"(", "2", "+", "(", "5", "-", "3", ")", ")"},Мой код выглядит следующим образом:

char** get_tokens(char* str, int n_tokens)
{
  char *new;
  int i = 0;
  char ** new_arr = malloc(sizeof(char) * n_tokens);
  if(new_arr == NULL)
    return NULL;

  new = strtok(str, " ");
  while(new != NULL)
  {
    printf("%s\n", new);
    new = strtok(NULL, " ");
  }
  char** p;

  return p;
}

Строка char ** p является просто кодом заполнения без ошибок компиляции.

Мне кажется, я правильно использовал strtok (), но у меня возникли проблемы с пониманием типа возвращаемого значения.Я не уверен в том, как использовать возвращение char ** и получить массив со строкой токена для дальнейшего использования.Если кто-то может помочь объяснить указатель на тип возвращаемого указателя и способы помочь сделать мой код делать то, что я хочу, был бы очень признателен.

1 Ответ

0 голосов
/ 12 ноября 2018

A char ** может указывать на массив char *, который вы хотите вернуть.

В вашем цикле вы хотите присвоить возвращаемое значение strtok элементам массива, на которые указывает new_arr. Вы также хотите выделить место для элементов размером sizeof(char *), а не sizeof(char):

  char ** new_arr = malloc(sizeof(char *) * n_tokens);
  if(new_arr == NULL)
    return NULL;

  new = strtok(str, " ");
  while(new != NULL)
  {
    printf("%s\n", new);
    new_arr[i++] = new;
    new = strtok(NULL, " ");
  }

  return new_arr;

Это работает при условии, что значение n_tokens является правильным. Если вы не знаете, сколько токенов, вы все равно можете сделать это, используя realloc, чтобы увеличить размер массива:

  char ** new_arr = malloc(sizeof(char *));
  if(new_arr == NULL)
    return NULL;

  new = strtok(str, " ");
  while(new != NULL)
  {
    printf("%s\n", new);
    new_arr[i++] = new;
    new_arr = realloc(new_arr, sizeof(char *) * (i + 1));
    if (new_arr == NULL) {
        return NULL;
    }
    new = strtok(NULL, " ");
  }

  return new_arr;
...