【问题标题】:Splitting a string by whitespace in c++ [duplicate]在c ++中按空格拆分字符串[重复]
【发布时间】:2011-01-17 12:33:16
【问题描述】:

可能的重复:
C++: How to split a string?
Splitting a string

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

我希望能够根据制表符、空格等拆分它,当然可以忽略多个制表符/空格/等。连续,并且最后没有这些东西的问题。

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

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

【问题讨论】:

标签: c++ string


【解决方案1】:

这是否是最好的可能值得商榷,但一种真正简单的方法是将你的字符串放入一个字符串流中,然后将数据读回:

// 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>()};

【讨论】:

  • 我更喜欢std::istringstream,但除此之外很好。 +1
  • 使用 C++11,您甚至可以使用大括号初始化来清理 morestd::vector&lt;std::string&gt; ret{std::istream_iterator&lt;std::string&gt;(buffer), {}};。使用 C++17,您甚至可以使用 CTAD 说 std::vector :)
【解决方案2】:

这是我用的:

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

【讨论】:

  • + 1 用于添加分隔符参数
猜你喜欢
  • 2011-12-28
  • 1970-01-01
  • 2021-04-01
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多