将字符串转换为字符串向量

时间:2017-01-13 06:22:42

标签: c++

我一直在尝试使用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];
}

3 个答案:

答案 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::istringstreamstd::getline()来解析这些行,而无需手动搜索,例如:

#include <sstream>

std::istringstream iss(print);
std::string line;
while (std::getline(iss, line))
{
    to_print.push_back(line);
}

或者,您可以使用std::copy()std::istream_iteratorstd::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)
);