【问题标题】:Following coding problem SIGSEGV Runtime Error以下编码问题 SIGSEGV 运行时错误
【发布时间】:2019-06-30 06:30:57
【问题描述】:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main() {
    int T;
    cin>>T;

    do{
        vector<int> ans;
        int N=0;
        cin>>N;
        vector<int> attackArray(N), defArray(N);

        for (int i =0; i<N; i++) {
            cin>>attackArray[i];
        }
        for (int i =0; i<N; i++) {
            cin>>defArray[i];
        }


        for (int i =0; i<N; i++) {
   int nexti, previ;
if (i == 0)
{
    nexti = 1;
    previ = N - 1;
}
else if (i == N - 1)
{
    nexti = 0;
    previ = N - 2;
}
else
{
    nexti = i + 1;
    previ = i - 1;
}
if (defArray[i] > attackArray[nexti] && 
    defArray[i] > attackArray[previ] && 
    defArray[i] > attackArray[nexti] + attackArray[previ]){

        ans.push_back(defArray[i]);

    }
else {ans.push_back(-1); break;}

}

        sort(ans.begin(), ans.end(), greater<int>());
        cout<<ans[0]<<endl;

        T--;
    }while (T !=0);


    return 0;
}

输入

输入的第一行包含一个整数 T,表示测试用例的数量。 T 测试用例的描述如下。 每个测试用例的第一行包含一个整数 N。 第二行包含 N 个空格分隔的整数 a1,a2,…,aN。 第三行包含 N 个空格分隔的整数 d1,d2,…,dN。

输出

对于每个测试用例,打印一行包含一个整数 - 国王获得的盾牌的最佳防御值,如果可以将厨师扔进蛇坑,则为 -1。

示例

2

4

1 1 4 1

3 4 2 1

7

5 4 5 4 5 4 5

3 2 4 7 2 5 9

示例输出

3

-1

【问题讨论】:

  • 请不要将答案编辑到您的问题中。它打破了这个问题。以及答案。
  • 好的,但当前问题的逻辑仍然相同,但我在提交答案时仍然收到与以前相同的错误。我没有收到以自定义输入为例。
  • std::vectorstd::array 替换所有数组使用。根本不要使用“常规”数组,看在老天的份上,摆脱你现在正在使用的可变长度数组的废话。然后通过将[ ] 替换为对at() 的调用,确保在使用std::vector/std::array 时不会越界。如果你要越界,而不是 SIGSEGV,你会得到一个 std::out_of_range 异常抛出。例如attackArray.at(nextI) 而不是attackArray[nextI]
  • 如果您完全删除常规/VLA 用法,坚持使用vector 或std::array,然后使用at(),您很可能会发现问题越界访问错误。目标是完全消除未定义的行为,一个好的开始是再次放弃使用常规数组,继续使用 std::vector / std::array,并利用自调试功能,例如使用 @ 987654332@电话。您很可能会发现您所说的适用于某些测试用例的原始代码实际上一直都是错误的。

标签: c++ compiler-errors runtime


【解决方案1】:

问题是您的if 语句序列应该是一个if ... else if ... else 语句。

if (i == 0)
    ...
else if (i==N-1)
    ...
else
    ...

除非您使用else,否则不会因为先前的if 条件评估为真而停止执行if 语句之后的代码。因此,即使在 i == 0i == N - 1 时,第三个 if 语句中的条件也会执行,从而导致数组访问越界和崩溃。

还有

int attackArray[N],defArray[N];

不是合法的 C++,因为所有数组大小都必须是编译时常量。您显然正在使用一个不关心的编译器,但您应该使用它,所以改用它

vector<int> attackArray(N), defArray(N);

最后在你的不同条件下有很多重复的代码。您可以通过为i 的下一个和上一个值添加几个额外的变量来简化很多。例如

int nexti, previ;
if (i == 0)
{
    nexti = 1;
    previ = N - 1;
}
else if (i == N - 1)
{
    nexti = 0;
    previ = N - 2;
}
else
{
    nexti = i + 1;
    previ = i - 1;
}
if (defArray[i] > attackArray[nexti] && 
    defArray[i] > attackArray[previ] && 
    defArray[i] > attackArray[nexti] + attackArray[previ])
    ...

【讨论】:

  • 好的,我试试实现。
  • 运行时错误:SIGSEGV 虽然给出的示例有效,但我在提交答案时收到错误。
猜你喜欢
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多