以下编码问题SIGSEGV运行时错误

时间:2019-02-06 10:26:48

标签: c++ compiler-errors runtime

#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。

输出

对于每个测试用例,打印一行包含一个整数-国王获得的盾牌的最佳防御值;如果可以将Chef扔进蛇坑,则为-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

1 个答案:

答案 0 :(得分:0)

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

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

除非先前的if条件评估为true,否则除非您使用if,否则在执行else语句后,代码不会停止执行。因此,即使ifi == 0时,第三个i == N - 1语句中的条件仍在执行,导致数组访问超出范围并崩溃。

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])
    ...