在c ++中用空格分割字符串的最佳方法是什么?
我希望能够根据制表符,空格等进行拆分,当然也可以忽略多个制表符/空格/等。连续不断,最后没有问题。
最终,我最终将它存储在一个向量中,但如果有一些简单的内置标准库分割方法,我可以轻松地在数据类型之间进行转换。
我在使用Microsoft Visual C ++的g ++,不的UNIX机器上构建它
答案 0 :(得分:16)
它是否最好可能会有疑问,但是一个真正简单方法是将字符串放入字符串流,然后将数据读回来:
// warning: untested code.
std::vector<std::string> split(std::string const &input) {
std::istringstream buffer(input);
std::vector<std::string> ret;
std::copy(std::istream_iterator<std::string>(buffer),
std::istream_iterator<std::string>(),
std::back_inserter(ret));
return ret;
}
如果您愿意,可以直接从迭代器初始化vector
:
std::vector<std::string> split(std::string const &input) {
std::istringstream buffer(input);
std::vector<std::string> ret((std::istream_iterator<std::string>(buffer)),
std::istream_iterator<std::string>());
return ret;
}
要么应该使用任何合理的C ++编译器。使用C ++ 11,您可以使用大括号初始化来清理第二个版本:
std::vector<std::string> ret{std::istream_iterator<std::string>(buffer),
std::istream_iterator<std::string>()};
答案 1 :(得分:13)
对于这个特殊问题可能有点过头了,但请考虑Boost.Regex。
(老实说,我可能只是编写一个脚本,通过'使用Boost'回复每个c ++问题,并在业力方面领先。但它确实有帮助。)
答案 2 :(得分:7)
这就是我使用的:
/* Tokenizing a string */
std::vector<std::string> Parser::tokenizer( const std::string& p_pcstStr, char delim ) {
std::vector<std::string> tokens;
std::stringstream mySstream( p_pcstStr );
std::string temp;
while( getline( mySstream, temp, delim ) ) {
tokens.push_back( temp );
}
return tokens;
}
你的delim是一个空格,p_pcstStr是要标记的字符串,返回的是一个包含所有字符串的向量。