我想使用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访问每个单独的元素,即红色。
答案 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;
}