【问题标题】:exited, segmentation fault退出,分段错误
【发布时间】:2020-03-31 16:11:43
【问题描述】:

此问题的输入是第一个数字,表示将输入多少个案例进行分析。

输入:

3
8 12
9 27
259 111

第一个数字表示将有 3 个案例。接下来的 3 行是案例。程序要输出3个case的GCD(Greatest Common Divisor)。

4
9
37

我写的代码如下:

#include <iostream>
#include <vector>

int gcd(int a, int b) {
   if (b == 0)
      return a;
   return gcd(b, a % b);

}

int main() {

   int N;

   std::cin >> N;

   int i = 0;

   std::vector<int> cards;

   while (i <= N) {
      i++;
      int F1, F2;
      std::cin >> F1 >> F2;
      cards[i] = gcd(F1, F2);
   }

   for (int j; j <= N; i++) {
      i++;
      std::cout << cards[i] << "\n";
   }
}

它读取第一个整数(测试用例的数量),运行一次循环(读取一个测试用例)并停止运行。终端输出exited, segmentation fault。有什么问题?

【问题讨论】:

  • 存在多个问题。您正在尝试使用 C 风格编写 C++ 代码。再次阅读你的书,使用调试器。
  • 您的最后一个 for 循环包含错字。
  • 记住 C 数组从索引 0 开始。不要跳过第 0 个条目,使用 &lt;= 的循环几乎总是不正确的。
  • 您的向量长度为​​零。是的,它代表一个动态数组,但您仍然需要使用cards.resize(N) 或类似方法设置它的大小(还要记住向量索引是从零开始的)。你的循环看起来也很奇怪;迭代N次的常用习语是for (int i = 0; i &lt; N; i++)
  • 你为什么要标记 C++11、14、17?

标签: c++ c++11 c++14 c++17


【解决方案1】:

在您的代码中存在一些问题,首先您没有设置向量的大小,结果就像它的长度为 0。

另一个错误是循环; 事实上,在第一个操作中,您在执行所有其他操作之前将 i 加 1,这样您将从向量的第二个分量开始插入(向量从 0 开始索引)。

在第二个循环中也存在一些问题,例如您声明一个变量 j 它完全没用,因为在以下操作中您仍然使用 i (设置在前一个循环的结束值,while 一个)。

尝试纠正这些事情并理解它,这样你也会理解错误的原因,这在 c++ 中很常见。

希望对你有所帮助:)

【讨论】:

    猜你喜欢
    • 2021-07-17
    • 1970-01-01
    • 2017-02-21
    • 2017-01-20
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    相关资源
    最近更新 更多