存储strtok()令牌的价值?

时间:2017-10-27 18:31:23

标签: c++ arrays string pointers strtok

我想使用strtok()函数来解析字符串,并且我想在返回的标记中创建值的副本(因为我收集了从此函数返回的标记)是指针)。

本质上,我的AIM是创建一个指向字符串数组的指针,这些字符串在每个标记的地址处保存值的副本。我的代码尝试到目前为止(并且失败)如下:(此外,我希望令牌能够为三个字符保留足够的空间)。

(注意我对改变我如何拆分字符串的方法不感兴趣 - 而且我知道strtok有缺点)

char words[] = "red, dry, wet, gut"; // this is the input string

char* words_split[100];
char token[3]; // creates space for a token to hold up to 3 characters (?)

int count = 0;

char* k = strtok(words, ",");   // the naming of k here is arbitrary
while (k != NULL) { 
   k = strtok(NULL, ",");
   token[0] = *k; // I'm aware the 0 here is wrong, but I don't know what it should be
   words_split[count] = token;
   count++;
}

然后,我希望能够从words_split访问每个单独的元素,即红色。

3 个答案:

答案 0 :(得分:2)

由于您使用的是C ++,只需使用向量来保存字符串:

  char words[] = "red, dry, wet, gut"; // this is the input string

  std::vector<std::string> strs;

  char* k;
  for (k = strtok(words, " ,"); k != NULL; k = strtok(NULL, " ,")) { 
    strs.push_back(k);
  }

  for(auto s : strs)
  {
    std::cout << s << std::endl;
  }

如果您需要从存储在向量中的字符串访问原始指针,只需执行s.c_str()

答案 1 :(得分:0)

您不需要token变量。您的代码将words_split的每个元素设置为指向相同的标记,这将最终成为字符串中的最后一个标记。

只需存储strtok返回的地址:

int count = 0;
k = strtok(words, ",");
while (k) {
    words_split[count++] = k;
}

如果您需要制作副本,可以使用strdup()功能:

    words_split[count++] = strdup(k);

这是POSIX函数,而不是标准C ++。如果需要,请参阅usage of strdup

或者使用std::string代替C字符串,就像在mnistic的答案中一样。

答案 2 :(得分:0)

这基本上是mnistic答案的改造版本。添加以防万一它可以帮助你。

#include <bits/stdc++.h>
using namespace std;


int main()
{
    char sentence[] = "red, dry, wet, gut"; // this is the input string

    vector<char *> words;

    for(char *token=strtok(sentence,","); token != NULL; token=strtok(NULL, ","))
    {
        const int wordLength = strlen(token) + 1;
        char *word = new char [wordLength];
        strcpy(word, token);
        words.push_back(word);
        cout << "\nWord = " << word;
    }


    // cleanup
    for(int i=0; i<words.size(); i++)
    {
        delete[] words[i];
    }

    return 0;
}