Runtime Error in C

Run time error in C

标签:C语言 RuntimeError


目录

  • Run time error in C
      • Run time error 的含义
      • 举例子
      • 总结


1.Run time error 的含义

-Run time error 便是指程序运行过程中崩溃了
-导致崩溃的原因有很多:
1)除数为0;
2)数组越界;
3)指针越界;
4)使用已经释放的空间;
5)数组定义过大,占用内存过大;
6)循环没有终止导致内存耗尽;
本博文主要讲第(6)点:循环没有终止导致内存耗尽

2.举例子

Description:
Write a program that reads an integer with 3 digits and adds all the digits in the integer.For example,if an integer is 932,the sum of all its digits is 9+3+2=14.
现在要假设处理的数字非常大( 2^64 < length <= 10^200 )
(length 指的是数字的大小!不是长度!)
input
123456789011121314151617181920
output
101

-没有一个数据类型能容下这么大的一个数字,因此我们一般采用字符数组或将数字储存在字符里,来吸收这段数字。

第一种方法:

# include 
# include 
int main(void) {
    int i, j = 0, sum = 0;
    int *a;
    char ch;
    a = malloc(sizeof(int)*10000);
    while ((i = getchar()) != '\n') {
        a[j] = i - 48;
        sum = sum + a[j];
        j++;
    }
    free(a);
    return 0;
}

第一种方法我是用getchar吸收字符赋到变量i,再将i - 48 (ASCII中数字与真实数字相差48)赋给一个数组,然后以叠加的形式求出数组之和,即求出各位数字之和。
但是神奇的是,我在电脑上编译成功,并且代码正常运行,却在刷题网上提示Runtime Error。这是什么原因呢?

其实问题就出在while括号内的“\n”
当我们在电脑编译并运行时,一旦我们完成了输入,便按下回车键(‘\n’)以进入下一步。然而,网上可不一样。网上检测代码是系统自动赋值,输出结果对比检验,然而它输入完毕后,系统不一定在“\n”条件下继续下一步,有可能是其他信息。就是因为这样,第一种方法放到在网上while变成了死循环,会将内存耗尽。

第二种方法

int main(void) {
    int i, sum = 0;
    char c[1000];
    scanf("%s", c);
    for (i = 0; i < strlen(c); i++) {
        int j = c[i];
        j = j - 48;
        sum = sum + j;
    }
    printf("%d\n", sum);
    return 0;
}

这个方法便避免了死循环,但有一个问题需要注意。此处我用的是strlen函数(能测出字符串的长度)。倘若没有该函数,把for循环中的运行条件改成i < 1000,就不能得出正确的值。因为我们输入一段数字,不一定将字符数组填满,故系统会用\0填充。\0也有ASCII码,故会导致sum的值不正确。因此要让字符数组读取到数字尾立刻结束循环。

3.总结

所以,我们发现,第一种方法只能在电脑上编译,而不能通过网上编译,移植性性较低。因此我们要尽量采用第二种方法来解决这类问题,即对一段较长数字的处理。


以上纯属本人观点,欢迎大家更正批评!


你可能感兴趣的:(C语言)