在c中标记字符串数组

Tokenizing an array of string in c

我是编程新手,我这辈子都搞不懂这个问题。我正在尝试创建一个函数来标记一个字符串,该字符串以 space 作为分隔符,指向字符串的指针和标记数作为参数。该函数应该 return 一个带有标记化字符串 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() 但我遇到麻烦的部分是理解 return 类型。我不确定如何使用 char** return 并拥有一个带有标记化字符串的数组供以后使用。如果有人可以帮助解释指向指针 return 类型的指针以及帮助使我的代码执行我想要的操作的方法,将不胜感激。

一个char **可以指向一个char *的数组,这就是你想要的return.

在您的循环中,您希望将 strtok 的 return 值分配给 new_arr 指向的数组元素。您还想为大小为 sizeof(char *) 的元素分配 space,而不是 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;