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