如何解决RUN_ERROR即使它正常编译
How to solve RUN_ERROR even though it compiles normally?
我目前正在编写一个脚本,关于从用户输入的大小数组中查找最近的重复项。数组必须介于 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.h
和 math.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++中的指针变量和引用变量之间有什么区别?