繁体   English   中英

创建一个返回字符串数组的函数

[英]Creating a function that returns an array of strings

我正在尝试创建一个字符串解析器,该字符串解析器使用定界符将字符串分解为字符串数组。 我正在使用函数“ strtok”,我知道该如何使用。 我不明白的是如何获取解析函数以返回字符串中不同单词的数组。 自从我使用C以来已经有一段时间了,所以事实证明这很困难。

char ** parseString(char * inString){

    char **ptr; //What I want to return, an array of strings
    int count = 0;

    ptr[count] = strtok(inString, " ");
    count++;
    while(inString!=NULL){
         ptr[count]=strtok(NULL, " ");
         count++;
    }
    return ptr;
}

我知道以上代码无法正常工作。 我隐约记得如何使用malloc,并且我知道我的上述代码将导致seg错误,因为我尚未进行malloc,但是以上本质上是我想要发生的事情。 如果我什至不知道字符串数组中需要包含多少个单词,我该如何适当地分配malloc?

由于一开始就不知道向量的大小,因此要分配向量有两种策略:

  • 您可以先解析inString以获取单词数,然后分配然后再次解析。
  • 您可以为每个单词重新分配。
  • 您可以随着几何增长进行重新分配。

在第一个变体中,您进行了两次解析,这使它们最糟糕

第二个缺点是有多个重新分配的缺点,但是在小的字符串上并且如果该函数不是很关键,则可以接受。

第三个是最好的,也是C ++中的std::vector所做的。

我在这里展示第二种。

您还需要将向量的大小保留在单独的变量中。

char** parseString(char* inString, size_t* tokensLen)
{
    char **tokens = NULL; // realloc on NULL acts like malloc so we simplify the code
    size_t i = 0;

    // parse the first word
    char* inToken = strtok(inString, " ");

    while (inToken)
    {
        // allocate for one more pointer
        tokens = realloc(tokens, (i + 1) * sizeof *tokens);
        assert(tokens);

        // point to word
        tokens[i] = inToken;

        // parse the next word
        inToken = strtok(NULL, " ");
        ++i;
    }

    // set size
    *tokensLen = i;

    return tokens;
}
int main()
{
    char str[] = "here we go";
    size_t len;
    char** tokens = parseString(str, &len);

    for (size_t i = 0; i < len; ++i)
    {
        printf("%s\n", tokens[i]);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM