在C++中用空格分割字符串

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;
}

如果愿意,可以直接从迭代器初始化vector

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将是标记化的字符串,返回的是一个向量,其中所有字符串之间都有空白。