OJ、ACM提交常见错误类型
一.Presentation Error(输出格式错误)
主要换行或者空格使用错误造成的 , 出现Presentation Error说明思路没问题,很多时候就是和后台样例有那么一点点点点差别,不是最标准的输出结果,自己稍微再修改一般可以对的吧。
常见PE错误:
- 每行输出之后有空行
- 每两行输出之间有空行
- 一行中,每个输出数字(或字符串,等)之间有空格
- 一行中,每个输出数字(或字符串,等)之后有空格
二.variable-sized object may not be initialized(编译错误)
原因,定义数组的时候使用变量来定义数组长度。
如下代码:
int a = 10;
char b[a]; //编译不报错
//char b[a] = "jfkd"; //报错,使用变量定义长度时,不可在定义时同时进行初始化赋值,需要在之后进行赋值
printf("b = %s, len = %d:%d\n", b, strlen(b), sizeof(b));
如下代码则无问题:
int a = 10;
char b[a]; //编译不报错
strcpy(b, "jfdljf");
printf("b = %s, len = %d:%d\n", b, strlen(b), sizeof(b));
原因:在C中,使用变量来定义数组长度是,这个数组可以定义,却不能同时进行初始化赋值,需要在之后赋值。
三. runtime error(运行时错误)程序崩溃了
- 除以零
- 数组越界:int a[3]; a[10000000]=10;
- 指针越界:int * p; p=(int *)malloc(5 * sizeof(int)); *(p+1000000)=10;
- 使用已经释放的空间:int * p; p=(int *)malloc(5 * sizeof(int));free§; *p=10;
- 数组开得太大,超出了栈的范围,造成栈溢出:int a[100000000];(一般较大的数组用全局变量不要用局部变量)
具体错误信息:
- Runtime Error(ARRAY_BOUNDS_EXCEEDED) // array bounds exceed 数组越界
- Runtime Error(DIVIDE_BY_ZERO) //divisor is nil 除零
- Runtime Error(ACCESS_VIOLATION) //illegal memory access 非法内存读取
- Runtime Error(STACK_OVERFLOW) //stack overflow 系统栈过载
四.process exited without return value 322212225725
-
栈溢出
- 超出了定义的数组的空间
- 递归或循环的出口判断失误导致无限循环
-
操作未未初始化的指针
- 对一个未分配内存空间的指针进行赋值或者拷贝操作
五.如果输入的数都正常,存储在数组中的数也正常但是输出时就不正常(全部为零)
原因可能是数据类型不匹配,如将unsigned long long int变量用%d输出或作为 f ( int x)的参数
六.Segmentation fault(分段错误)
七.没有与参数列表匹配的 重载函数 “sort” 实例 – 参数类型为: (book *, book *, < unknown-type >)"
struct book
{
int v,w;
double y;
int index;
} a[maxx];
bool cmp(struct book a,struct book b)//如果这个位置不加struct就会报这个错
{
return a.y<b.y;
}
int f(double x)
{
double sum=0;
for(int i=1;i<=n;i++)
{
a[i].y=a[i].v-x*a[i].w;
}
sort(a+1,a+n+1,cmp);
for(int i=n;i>=n-k+1;i--)
sum+=a[i].y;
if(sum>=0) return 1;
return 0;
}
八.Time Limit Exceeded(运行超出时间限制)
-
没有循环终止条件 (加上终止条件)
-
函数调用超时 (改用循环而不是用递归)
要用到一个n的阶乘时 ,调用了一个递归函数来求阶乘,运行测试正确,却出现了超时情况。然后换了一种做法,用一个for循环去求阶乘,结果就通过了。递归调用因为经常会调用自身很多次,所以时间的复杂度是指数级别的。
-
程序算法不够优化 (优化算法)
-
程序本身存在问题
-
没有判断输入结束
- while(scanf("%d",&n)!=EOF))
- while(~scanf("%d",&n))
- while(gets(s)!=NULL)
九.Memory Limit Exceeded(内存超限)
空间复杂度太大
十.Output Limit Exceeded(输出超限)
OLE一般是某地方输出陷入了死循环,或者输出没有明确的终止(一般是由于输入没有明确终止)。
例如:
while(~scanf("%s",str)){}//本应这么写
while(scanf("%s",str)){}//如果怎么写就会导致输出超限(while一直不会终止)
十一.Compile Error(编译错误)
-
变量未定义就使用,或定义后使用位置超出了定义的作用域。
说明:如b=25但程序并未在使用前定义好b的类型,还应注意变量作用域。
-
括号不匹配。
说明:()、[]、{}一定要有始就得有终。
-
使用非法类型。
说明:如__int64在GCC编译器下不识别,你却用它。
-
需少分号。
说明:忘了语句以一个分号结束。
-
用函数未引头文件。
说明:如printf函数在G++中未包含stdio.h文件。
-
包含非标准头文件。
说明:如conio.h并非标准库中定义的头文件。
-
使用非标准库函数。
说明:如itoa、strupr等并不是C标准库中的函数,不能使用。
-
有非法字符。
-
提交时所用的语言不对,比如c++的程序用c交了(c写的程序用c++提交可以过)
-
自定义函数未声明就使用
-
程序连编译都不能过,有各种错误