【问题标题】:Tokenizing an array of string in c在c中标记字符串数组
【发布时间】:2023-03-16 01:34:02
【问题描述】:

我是编程新手,我一生都无法解决这个问题。我正在尝试创建一个对字符串进行标记的函数,该字符串以空格作为分隔符,指向字符串的指针和标记的数量作为参数。该函数应返回一个带有标记化字符串 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** 返回并拥有一个带有标记化字符串的数组以供以后使用。如果有人可以帮助解释指向指针返回类型的指针以及帮助使我的代码执行我想要的操作的方法,将不胜感激。

【问题讨论】:

    标签: c arrays string split strtok


    【解决方案1】:

    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;
    

    【讨论】:

    • @Soulo 很高兴我能帮上忙。如果您觉得有用,请随时 accept this answer
    猜你喜欢
    • 2018-03-23
    • 2010-09-20
    • 2011-05-31
    • 1970-01-01
    • 2010-12-01
    • 2012-04-20
    • 1970-01-01
    相关资源
    最近更新 更多