我一直在尝试使用std::string::find()
方法将std::string
转换为std::vector
行,但我一直遇到无限循环。
//string is called print
int start=0;
while(start<print.size())
{
int end=print.find("\n",start);
to_print.push_back(print.substr(start,end));
start=end+1;
}
for(int j=0;j<to_print.size();j++)
{
cout<<to_print[j];
}
答案 0 :(得分:2)
您应该按如下方式更改while循环:
while (start < print.size())
{
int end = print.find("\n", start);
if (end != string::npos)
{
to_print.push_back(print.substr(start, end));
start = end + 1;
}
else
{
to_print.push_back(print.substr(start));
break;
}
}
答案 1 :(得分:1)
你的例子并不完整,但事实上,当find
找不到它返回npos
的东西时,转换为签名int
的是-1。然后start=end+1
将0添加到start
。因此start
不会改变。
答案 2 :(得分:0)
您没有考虑当循环到达字符串中的最后一行时,find()
会返回std::string::npos
,因为找不到"\n"
。
话虽如此,您可以使用std::istringstream
和std::getline()
来解析这些行,而无需手动搜索,例如:
#include <sstream>
std::istringstream iss(print);
std::string line;
while (std::getline(iss, line))
{
to_print.push_back(line);
}
或者,您可以使用std::copy()
与std::istream_iterator
和std::back_inserter
完全避免手动循环,例如:
#include <sstream>
#include <algorithm>
#include <iterator>
class line : public std::string {}
std::istream& operator>>(std::istream &in, line &l)
{
return std::getline(in, l);
}
std::istringstream iss(print);
std::copy(
std::istream_iterator<line>(iss),
std::istream_iterator<line>(),
std::back_inserter(to_print)
);