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

时间:2019-09-08 22:16:04

标签: c

我正在尝试创建一个字符串解析器,该字符串解析器使用定界符将字符串分解为字符串数组。我正在使用函数“ 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?

1 个答案:

答案 0 :(得分:1)

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

  • 您可以先解析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]);
    }
}