gpt4 book ai didi

c++ - 逗号分隔标记到 const char 的 vector **

转载 作者:搜寻专家 更新时间:2023-10-31 00:12:28 27 4
gpt4 key购买 nike

我正在尝试将逗号分隔的字符串转换为 const char* 的 vector 。使用以下代码,预期输出为

ABC_
DEF
HIJ

但是我明白了

HIJ
DEF
HIJ

我哪里错了?

代码:

#include <iostream>
#include <boost/tokenizer.hpp>
#include <vector>
#include <string>
using namespace std;

int main()
{
string s("ABC_,DEF,HIJ");
typedef boost::char_separator<char> char_separator;
typedef boost::tokenizer<char_separator> tokenizer;

char_separator comma(",");
tokenizer token(s, comma);
tokenizer::iterator it;

vector<const char*> cStrings;

for(it = token.begin(); it != token.end(); it++)
{
//cout << (*it).c_str() << endl;
cStrings.push_back((*it).c_str());
}

std::vector<const char*>::iterator iv;
for(iv = cStrings.begin(); iv != cStrings.end(); iv++)
{
cout << *iv << endl;
}
return 0;
}

http://ideone.com/3tvnUs

编辑:借助以下答案的解决方案:(PaulMcKenzie 使用列表提供了一个更简洁的解决方案。)

#include <iostream>
#include <boost/tokenizer.hpp>
#include <vector>
#include <string>
using namespace std;

char* createCopy(std::string s, std::size_t bufferSize)
{
char* value = new char[bufferSize];
memcpy(value, s.c_str(), (bufferSize - 1));
value[bufferSize - 1] = 0;
return value;
}

int main()
{
string s("ABC_,DEF,HIJ");
typedef boost::char_separator<char> char_separator;
typedef boost::tokenizer<char_separator> tokenizer;

char_separator comma(",");
tokenizer token(s, comma);
tokenizer::iterator it;

vector<const char*> cStrings;

for(it = token.begin(); it != token.end(); it++)
{
//cout << it->c_str() << endl;
cStrings.push_back(createCopy(it->c_str(),
(it->length() + 1)));
}

std::vector<const char*>::iterator iv;
for(iv = cStrings.begin(); iv != cStrings.end(); iv++)
{
cout << *iv << endl;
}

//delete allocations by new
//...
return 0;
}

最佳答案

事情是这样的:boost::tokenizer::iterator 不会返回字符串拷贝的所有权,而是返回对内部拷贝的引用。

例如,在运行您的代码后我得到:

HIJ
HIJ
HIJ

解决方案是将 cStrings.push_back((*it).c_str()) 替换为以下之一:

    char* c = new char[it->length() + 1];
c[it->length()] = 0;
cStrings.push_back(c);
std::strncpy(c, it->c_str(), it->length());

看起来不漂亮,但你可能不会比那更快(至少如果你想使用 boost::tokenizer

其他选项是用例如完全替换 boost::tokenizer strtok - 示例可在此处找到:C split a char array into different variables

您还可以使用 boost::algorithm::string::split,但您可能需要将 string 重新映射到 const char* 稍后。

关于c++ - 逗号分隔标记到 const char 的 vector **,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30178377/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com