C++ 向量<string> 段错误

C++ vector<string> segfaults

我在以下代码中不断遇到段错误!任何人都可以解释发生了什么吗?

#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    string line;
    getline(cin, line, '\n');
    istringstream iss(line);
    vector<string> result;

    for(string token; getline(iss, token, ' '); )
    {
        //if(token.empty()) continue;
        result.push_back(token); // << Segfaults here
    }

    for(int i = result.size()-1; i>=0; i++)
    {
        cout << result[i] << ' ';
    }

    return 0;
}
  for(int i = result.size()-1; i>=0; i++){

你的循环不会停止。

也许你想要:

for(int i = result.size()-1; i >= 0; i--)

或者,更好的是:

for(auto i = result.rbegin(); i!= rend(); i++) {
  cout << *i << ' ';
}

我会考虑使用boost::adaptors::reverse

#include <vector>
#include <iostream>
#include <boost/range/adaptor/reversed.hpp>

int main()
{
    std::vector<int> x {1,2,3};
    for (const auto& i : boost::adaptors::reverse(x))
    {
        std::cout << i << std::endl;
    }
}

正如之前的回答中已经指出的那样,您在此处的索引检查 i>=0 有问题:

for(int i = result.size()-1; i>=0; i++)

但是,我想指出的是,您可以使用 反向迭代器,例如:

 for (auto it = result.rbegin(); it != result.rend(); ++it)

请注意,使用这样的代码,您可以让代码 reader/maintainer 清楚地知道您的意图是以 反向 顺序遍历向量(使用 rbegin()rend()).


可编译示例代码如下(live here):

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
    vector<string> result{ "Hello", "World", "123" };

    for (auto it = result.rbegin(); it != result.rend(); ++it)
    {
        cout << *it << ' ';
    }
}

输出:

123 World Hello