Splitting a string by whitespace in c++
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicates:
C++: How to split a string?
Splitting a string
在C++中用空格分割字符串的最佳方法是什么?
我希望能够基于制表符、空格等对其进行拆分,当然,在一行中忽略多个制表符/空格等,并且在结尾处不存在这些问题。
最后,我将把它存储在一个向量中,但是如果有一些简单的内置标准库拆分方法,我可以很容易地在数据类型之间转换。
我在使用G++的UNIX机器上构建这个,而不是使用微软Visual C++
可能会有人质疑它是否是最好的,但一个真正简单的方法是将字符串放入Stringstream,然后将数据读回:
1 2 3 4 5 6 7 8 9 10 | // 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; } |
如果愿意,可以直接从迭代器初始化
1 2 3 4 5 6 | 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,您可以通过使用括号初始化来清理第二个版本,而不是:
1 2 | std::vector<std::string> ret{std::istream_iterator<std::string>(buffer), std::istream_iterator<std::string>()}; |
对于这个特定的问题,它可能是多余的,但是考虑boost.regex。
(老实说,我可能只写一个脚本,用"使用Boost"来回答每一个C++问题,然后在业力中走出来。但这确实有帮助)。
这是我使用的:
1 2 3 4 5 6 7 8 9 10 11 12 | /* 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将是标记化的字符串,返回的是一个向量,其中所有字符串之间都有空白。