即使正常编译,如何解决RUN_ERROR?

时间:2019-06-09 06:09:42

标签: c++

我当前正在编写有关从用户输入的尺寸数组中查找最接近的重复项的脚本。 数组必须在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);
}

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

首先,如果您使用C编写,请将此问题标记为C问题,而不是C ++问题。 scanfprintf是C函数,与您所包含的stdio.hstdlib.hmath.h一样。在c ++中,您有include 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; 
}

了解引用和指针之间的区别:What are the differences between a pointer variable and a reference variable in C++?