c ++通过双换行拆分字符串

时间:2012-07-07 08:26:16

标签: c++ string split

我一直试图通过双换行符("\n\n")拆分字符串。

input_string = "firstline\nsecondline\n\nthirdline\nfourthline";

size_t current;
size_t next = std::string::npos;
do {
  current = next + 1;
  next = input_string.find_first_of("\n\n", current);
  cout << "[" << input_string.substr(current, next - current) << "]" << endl;
} while (next != std::string::npos);

给我输出

[firstline]
[secondline]
[]
[thirdline]
[fourthline]

这显然不是我想要的。我需要得到像

这样的东西
[first line
second line]
[third line
fourthline]

我也试过boost::split,但它给了我相同的结果。我错过了什么?

3 个答案:

答案 0 :(得分:5)

find_first_of仅查找单个字符。通过传递"\n\n"告诉它要做的是找到'\n''\n'中的第一个,这是多余的。请改用string::find

boost::split也可以一次只检查一个字符。

答案 1 :(得分:1)

这种方法怎么样:

  string input_string = "firstline\nsecondline\n\nthirdline\nfourthline";

  size_t current = 0;
  size_t next = std::string::npos;
  do
  {
    next = input_string.find("\n\n", current);
    cout << "[" << input_string.substr(current, next - current) << "]" << endl;
    current = next + 2;
  } while (next != std::string::npos);

它给了我:

[firstline
secondline]
[thirdline
fourthline]

结果,这基本上就是你想要的,对吗?

答案 2 :(得分:0)

@Benjamin在他的回答中很好地解释了你的代码不起作用的原因。所以我会告诉你一个替代解决方案。

无需手动拆分。对于您的具体情况,std::stringstream是合适的:

#include <iostream>
#include <sstream>

int main() {
        std::string input = "firstline\nsecondline\n\nthirdline\nfourthline";
        std::stringstream ss(input);
        std::string line;
        while(std::getline(ss, line))
        {
           if( line != "")
                 std::cout << line << std::endl;
        }
        return 0;
}

输出(demo):

firstline
secondline
thirdline
fourthline