在c ++中用空格拆分字符串

Bri*_*ian 15 c++ string

可能重复:
C++:如何拆分字符串?
分裂一个字符串

在c ++中用空格分割字符串的最佳方法是什么?

我希望能够根据制表符,空格等拆分它,当然也可以忽略多个制表符/空格/等.连续,并没有在最后有这些事情的问题.

最后,我最终将它存储在一个向量中,但如果有一些简单的内置标准库分割方法,我可以轻松地在数据类型之间进行转换.

我在使用g ++的UNIX机器上构建它,而不是使用Microsoft Visual C++

Jer*_*fin 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;
}
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以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;
}
Run Code Online (Sandbox Code Playgroud)

要么应该使用任何合理的C++编译器.使用C++ 11,您可以使用大括号初始化来清理第二个版本:

    std::vector<std::string> ret{std::istream_iterator<std::string>(buffer), 
                                 std::istream_iterator<std::string>()};
Run Code Online (Sandbox Code Playgroud)


Dav*_*ler 14

对于这个特定问题可能有点过分,但考虑Boost.Regex.

(老实说,我可能只是编写一个脚本,通过'使用Boost'响应每个c ++问题,并在业力方面领先.但它确实有帮助).

  • 你的第二段+1.没有增加的代表就不能离开你. (5认同)

小智 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;
    } 
Run Code Online (Sandbox Code Playgroud)

你的delim将是一个空格,p_pcstStr将是一个标记化的字符串,返回将是一个向量,其中所有字符串之间都有一个空格.

  • + 1用于添加分隔符参数 (2认同)