逗号的向量分开代币到const char **
Vector of comma separated token to const char**
我正在尝试将逗号分隔的字符串转换为const char*的向量。使用以下代码,预期输出为
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将char数组分为不同的变量
您也可以使用boost::algorithm::string::split
,但是后来您可能需要将string
重新映射到const char*
。
这是一种不需要动态分配的方法,同时为您提供所需的std :: vector。诀窍是在"永久"存储中创建您的参数,然后将指针的向量设置为此存储。
下面的代码使用std::list
进行永久存储。我们之所以保证在将项目添加到列表容器中时,std::list
中的项目的迭代器不会无效。这是构建const char *
的最终向量时的必要条件。
#include <iostream>
#include <boost/tokenizer.hpp>
#include <vector>
#include <string>
#include <list>
typedef std::vector<char> CharArray;
typedef std::list<CharArray> StringList;
using namespace std;
int main()
{
StringList sList;
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)
{
// create an array of char and place on list
sList.push_back(CharArray(it->begin(), it->end()));
// null terminate this entry
sList.back().push_back(0);
// add the pointer to this entry to the vector of const char *.
cStrings.push_back(&sList.back()[0]);
}
std::vector<const char*>::iterator iv;
for(iv = cStrings.begin(); iv != cStrings.end(); iv++)
{
cout << *iv << endl;
}
}
请注意,我们不必在此处动态分配内存。您唯一需要确保的是StringList
不会超出范围,因为这是您的参数的地方。
相关文章:
- 在字符串函数中抛出'char const*'实例后调用的终止
- 双重标准?为什么只有 char* const&a = "bla" 的警告?
- 包括"lvtocon.h",未定义对'operator<<(std::ostream&, char const*)的引用
- 为什么 const char* const & = 可以编译"hello"?
- 将字符串文本常量定义为 char const* 和 wchar const*
- 如何将std::wstring转换为char const[]
- "char const * name() const _WEBSOCKETPP_NOEXCEPT_TOKEN_ {"剂量是什么意思
- 使用提升对字符串进行标记化时,将令牌转换为 char* const* 时失败
- 如何从 std::initializer_list<char const* 构建 std::vector<std::string>>
- 将 std::vector<std::string> 转换为 const char* const*
- 引发"char const*"错误的实例后调用的终止
- 将const char * const参数成员分配给新值
- 从'const char**'到'char* const*'的转换无效
- 从 sub_match<常量字符 *>' 转换为'const char *const &'
- char*const和constchar*之间有什么区别?(重复-需要更多澄清)
- 使用工厂方法时编译器错误:无法转换"const std::p air<char* const
- HEVC 解码器端口 Android 警告:从 'signed char*' 到 'char const* 的转换无效*
- 如何从'char const*'中删除常量
- 'char const *str'作为模板参数
- 为什么不;t strlen(.)应为const char*const str,而不是const char*