在C中标记字符串数组

时间:2018-11-12 20:49:41

标签: c arrays string split strtok

我是编程新手,一生都无法解决这个问题。我正在尝试创建一个函数,该函数使用空格作为定界符并以该字符串的指针和标记数作为参数来标记化字符串。该函数应返回带有标记化字符串Ex的char数组。将“(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 :(得分:0)

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;