如何解决RUN_ERROR即使它正常编译

How to solve RUN_ERROR even though it compiles normally?

本文关键字:常编译 编译 何解决 解决 RUN ERROR      更新时间:2023-10-16

我目前正在编写一个脚本,关于从用户输入的大小数组中查找最近的重复项。数组必须介于 1 和 10^5 之间,其值也必须介于 1 和 10^5 之间。它在我的计算机上正常编译,但每当我提交它时,它都会返回一个run_error。

这是我写的。

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
void input (int *);
int main(){
    int n;
    input (&n);
    int a[n];
    for(int i=0;i<n;i++){
        if (scanf("%d",&a[i])!=1) 
            return 0;
        if ((a[i]>100000)||(a[i]<1))
            return 0;
        }
    for (int i=0;i<n;i++){
        if (a[abs(a[i])]>=0){
            a[abs(a[i])]=-a[abs(a[i])];
        } else {
            printf("%d",abs(a[i]));
            return 0;
        }
    } 
    return 0; 
}
void input(int *x){
    if (scanf("%d",x)!=1)
        exit(0);
    if ((*x>100000)||(*x<1))
        exit(0);
}

这个程序在逻辑上是不正确的。n 中定义的数组大小与允许元素的限制之间没有联系。

由于您允许a[i]>100000最多 10^5,而不考虑 a[n] 定义的数组的大小,因此以下访问将尝试访问数组边界之外的任何a[i] > n a[abs(a[i](]。

此外,您可以通过引用传递语法简单

input(n);
void input(int &x){
    if (scanf("%d",&x)!=1)
        exit(0);
    if (x>100000 ||x<1)
        exit(0);
}

首先,如果你用C语言写作,请将这个问题标记为C问题,而不是C++问题。 scanf & printf 是 C 函数,就像您的 stdio.h & stdlib.hmath.h 一样。在 c++ 中,你有包含iostream,在这种情况下,这就是你真正需要的。

这里的第二个问题是当输入验证出错时处理输入验证的方式。 exit是非常危险的方式,非常不推荐。如果要抛出异常,请使用throw方法(阅读两者之间的区别:https://stackoverflow.com/a/56406586/8038186(。但是,在这种情况下,我不明白为什么你需要抛出异常。您可以简单地以更温和的方式完成程序。请考虑以程:

#include <iostream>
using namespace std;
// Num is moved by reference and not by pointer
bool input(int &num) { // return true if the input is good, otherwise return false.
    cout << "Please enter number: " << endl; // Tell the user that he should enter a number.
    cin << num;
    bool is_valid = num >= 1 && num <= 1e5; // 1e5 = 100000
    if (!is_valid) cout << "Invalid input." << endl;
    return is_valid;
}
int main() {
    int n;
    if (!input(n)) {
        return 0;
    }
    int a[n];
    int i;
    for (i = 0; i < n && input(a[i]); i++);
    if (i < n) {
        return 0;
    }
    for (i = 0; i < n; i++) {
        // The following if is useless, the validation make sure already that all of the numbers are legal.
        //if (a[a[i]] >= 0) { // You don't need abs(a[i]), a[i] > 1
        if (a[i] < n)
            a[a[i]] = -a[a[i]];
        else cout << "Consider what do you want to do" << endl;
        /*} else {
            printf("%d", a[i]);
            return 0; 
        }*/
    } 
    return 0; 
}
阅读有关引用和指针

之间的区别:C++中的指针变量和引用变量之间有什么区别?