我一直试图通过双换行符("\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
,但它给了我相同的结果。我错过了什么?
答案 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