【问题标题】:C++ vector<string> segfaultsC++ 向量<string> 段错误
【发布时间】:2015-04-10 09:06:58
【问题描述】:

我不断收到以下代码的段错误!谁能解释发生了什么?

#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;
}

【问题讨论】:

    标签: c++ vector segmentation-fault


    【解决方案1】:
      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 << ' ';
    }
    

    【讨论】:

    • 该死!我怎么没看到这个!谢谢!
    • 您可能没有看到它,因为您没有添加日志记录来进行故障排除。最明显的记录是iresult.size() 就在cout 行之前。那会立即解决问题。 (您可以使用调试器、分析核心转储或许多其他方式来做同样的事情。)
    • 另一件事:auto i = result.rend(); i!=result.rbegin(); i-- 是否也可以正常工作? auto 似乎不起作用。我应该包括什么才能让它工作?
    • @cipher: auto 需要 C++11 或更高版本。如果你被困在过去,你需要vector&lt;string&gt;::reverse_iterator。从 rend() 开始是错误的 - 这是一个“过去的”迭代器,用于标记反向序列的结束。
    • @MikeSeymour 对,他需要i = result.rend()-1; ... 不错的收获。
    【解决方案2】:

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

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

    不过,我想指出的是,您可以使用 反向迭代器 提高代码的“语义级别”(并避免出现上述错误) >,例如:

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

    请注意,使用这样的代码,您可以让代码阅读器/维护者清楚您的意图是以 reverse 顺序遍历向量(使用 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
    

    【讨论】:

      【解决方案3】:

      我会考虑使用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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-02
        相关资源
        最近更新 更多