我需要通过分隔符来标记字符串。
例如:
对于"One, Two Three,,, Four"
,我需要{"One", "Two", "Three", "Four"}
。
我正在尝试使用此解决方案https://stackoverflow.com/a/55680/1034253
std::vector<std::string> strToArray(const std::string &str,
const std::string &delimiters = " ,")
{
boost::char_separator<char> sep(delimiters.c_str());
boost::tokenizer<boost::char_separator<char>> tokens(str.c_str(), sep);
std::vector<std::string> result;
for (const auto &token: tokens) {
result.push_back(token);
}
return result;
}
但我收到错误:
boost-1_57 \ boost / tokenizer.hpp(62):错误C2228:左边的&#39; .begin&#39;必须有class / struct / union type是&#39; const char * const&#39;
答案 0 :(得分:2)
改变这个:
boost::tokenizer<boost::char_separator<char>> tokens(str.c_str(), sep);
对此:
boost::tokenizer<boost::char_separator<char>> tokens(str, sep);
链接: http://www.boost.org/doc/libs/1_57_0/libs/tokenizer/tokenizer.htm
容器类型需要begin()
函数,而const char *(c_str()
}返回的内容不符合此要求。
答案 1 :(得分:1)
Boost的标记器可能对您描述的任务有点过分。
boost::split
是为这个确切的任务编写的。
std::vector<std::string> strToArray(const std::string &str,
const std::string &delimiters = " ,")
{
using namespace boost;
std::vector<std::string> result;
split( result, str, is_any_of(delimiters), token_compress_on );
return result;
}
该可选token_compress_on
表示您的,,,
输入不应在这些逗号之间隐含空字符串代码。
答案 2 :(得分:1)
简短的方法。
string tmp = "One, Two, Tree, Four";
int pos = 0;
while (pos = tmp.find(", ") and pos > 0){
string s = tmp.substr(0, pos);
tmp = tmp.substr(pos+2);
cout << s;
}
答案 3 :(得分:0)
我看到很多boost
个答案,所以我认为我会提供非boost
答案:
template <typename OutputIter>
void Str2Arr( const std::string &str, const std::string &delim, int start, bool ignoreEmpty, OutputIter iter )
{
int pos = str.find_first_of( delim, start );
if (pos != std::string::npos) {
std::string nStr = str.substr( start, pos - start );
trim( nStr );
if (!nStr.empty() || !ignoreEmpty)
*iter++ = nStr;
Str2Arr( str, delim, pos + 1, ignoreEmpty, iter );
}
else
{
std::string nStr = str.substr( start, str.length() - start );
trim( nStr );
if (!nStr.empty() || !ignoreEmpty)
*iter++ = nStr;
}
}
std::vector<std::string> Str2Arr( const std::string &str, const std::string &delim )
{
std::vector<std::string> result;
Str2Arr( str, delim, 0, true, std::back_inserter( result ) );
return std::move( result );
}
trim
可以是任何修剪函数,我使用this SO answer。它使用std::back_inserter
和递归。你可以轻松地在循环中完成它,但这听起来更有趣:)