我是编码新手,我面临一个问题

im reatively new to coding and im facing a problem

本文关键字:问题 一个 编码 新手      更新时间:2023-10-16

我是竞争性编程的新手 我一直在尝试解决有关代码厨师的问题。 当我尝试使用我的开发 C++ 编译器时,我没有收到任何错误,但是我在在线代码厨师 IDE 上收到运行时错误。

int main() {
    int n,q;
    int l,r;
    int *A;
    int *B;
    int *J;
    int *C;
    cin >> n >> q;
    A=new int[n];
    B=new int[n];
    J=new int[n];
    C=new int[q];
    for (int i=0;i<n;i++) {
        cin >> A[i];
    }
    for (int i=0;i<n;i++) {
        cin >> B[i];
    }
    J[0]=0;
    for (int j=1;j<n+1;j++) {
        J[j]=J[j-1]+(A[j-1]*B[j-1]);
    }
    for (int i=0;i<q;i++) {
        cin >> l >> r;
        if (r==1) {
            C[i]=J[1];
        }
        else {
            C[i]=J[r]-J[l-1];
        }
    }
    for(int i=0;i<q;i++){
        cout << C[i] << endl;
    }
    delete []A;
    delete []B;
    delete []C;
    delete []J;
    return 0;
}

在抛出"std::bad_array_new_length"实例后终止调用

what():  std::bad_array_new_length

cin >> n >> q;
A=new int[n];
B=new int[n];
J=new int[n];
C=new int[q];

您确实检查是否输入了有效的尺寸,甚至没有输入某些内容

什么((: 标准::bad_array_new_length

表示 n 和/或 q 的值对于new [n]new[q]来说太大。如果您输入负整数(大小是无符号的(,或者如果您没有输入 2 个有效整数,因此至少一个 of vars 未初始化(未定义的行为(,或者当然如果您输入至少一个非常大的整数,则很可能是这种情况。

一般来说,所有cin >> ...都必须if (!(cin >> ...)) { ...error management ... }

所以至少要做到:

if (!(cin >> n >> q) || (n < 1) || (q < 1)) {
  cerr << "invalid sizes" << endl;
  return -1;
}

拥有

J=new int[n];
...
for(int j=1;j<n+1;j++){
    J[j]=J[j-1]+(A[j-1]*B[j-1]);
}

J[j]在最后一轮J[n],因此您写出了分配的数组


也在

for(int i=0;i<q;i++){
    cin >> l >> r;
    if(r==1){
        C[i]=J[1];
    }
    else{
    C[i]=J[r]-J[l-1];
}

您不检查 LR 的值是否有效索引,也不检查整数是否作为输入

cin >> l >> r;可以是这样的

if (!(cin >> l >> r) || 
    (r < 0) || (r >= n) ||
    (l < 1) || (l >= (n - 1))) {
  cerr << "invalid indexes" << endl;
  return -1;
}