• noi25 最长最短单词(为什么会出现运行时错误)


    noi25 最长最短单词(为什么会出现运行时错误)

    一、总结

    一句话总结:比如除以零,数组越界指针越界使用已经释放的空间数组开得太大,超出了栈的范围,造成栈溢出

    1、c++报runtime error是什么意思?

    runtime  error (运行时错误)就是程序运行到一半,程序就崩溃了。

    2、为什么会出现运行时错误?

    ①除以零
    
    ②数组越界: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); *p=10;
    
    ⑤数组开得太大,超出了栈的范围,造成栈溢出:int a[100000000];一般来说,在

    3、算法题如何查错(比如这里的运行错误)?

    把代码按样例运行自己推演一遍,就知道错在哪了 ,比如这里的运行错误,

    拿特殊案例推演(这里用的空字符串案例就发现最后代码有问题),容易发现错误,就是推演

    二、noi25 最长最短单词(为什么会出现运行时错误)

    1、题目描述

    总时间限制: 
    1000ms
     
    内存限制: 
    65536kB
    描述

    输入1行句子(不多于200个单词,每个单词长度不超过100),只包含字母、空格和逗号。单词由至少一个连续的字母构成,空格和逗号都是单词间的间隔。

    试输出第1个最长的单词和第1个最短单词。 

    输入
    一行句子。
    输出
    两行输出:
    第1行,第一个最长的单词。
    第2行,第一个最短的单词。
    样例输入
    I am studying Programming language C in Peking University
    样例输出
    Programming
    I
    提示
    如果所有单词长度相同,那么第一个单词既是最长单词也是最短单词。
    来源
    习题(12-2)
     

    2、代码

    代码一:

     1 #include<iostream>
     2 #include<cstring>
     3 char a[25000];// 数组要足够大 
     4 using namespace std;
     5 int main()
     6 {
     7     gets(a);
     8     int minn = 110, maxn = 0, c, d, e, q = 0, b = 0;
     9     int l = strlen(a);
    10     a[l] = ' ';//不加这一句会出现runtime error
    11     for(int i = 0; i <= l; ++i)
    12     {
    13         if(a[i] != ' ' && a[i] != ',')
    14         {
    15              ++ b;
    16         }
    17         else if(b > 0) //为单词结束符号
    18         {
    19             if(b > maxn) 
    20             {
    21                  maxn = b;
    22                  c = i - b;//记录单词的头位置
    23             }
    24              if(b < minn) 
    25              {
    26                  minn = b;
    27                  d = i - b;
    28             }
    29             b = 0;//单词长度清0,开始计算下一个单词
    30         }
    31     
    32     }     
    33     //输出最长单词和最短单词
    34     for(int i = c; i <= c + maxn - 1; ++i)
    35         cout << a[i];
    36     cout << endl;
    37     for(int i = d; i <= d + minn - 1; ++i)
    38         cout << a[i];
    39     return 0;    
    40 }

    代码一种不加第十句,会出现运行时错误。

    10     a[l] = ' ';//不加这一句会出现runtime error

    再不加第十句,并且第11句换成小于l,也报运行时错误,原因可能是 字符串没有被访问完全而再次访问,也就是说字符串没有访问到''。

    11     for(int i = 0; i <= l; ++i)

    代码二:

     1 #include<iostream>
     2 #include<cstring>
     3 char a[25000];// 数组要足够大 
     4 using namespace std;
     5 int main()
     6 {
     7     gets(a);
     8     int minn = 110, maxn = 0, c, d, e, q = 0, b = 0;
     9     int l = strlen(a);
    10     //a[l] = ' ';//
    11     for(int i = 0; i <=l; ++i)
    12     {
    13         if(a[i]==''){
    14             if(b > 0){
    15                 if(b > maxn) 
    16                 {
    17                      maxn = b;
    18                      c = i - b;//记录单词的头位置
    19                 }
    20                  if(b < minn) 
    21                  {
    22                      minn = b;
    23                      d = i - b;
    24                 }
    25                 b = 0;//单词长度清0,开始计算下一个单词
    26             }
    27 
    28         }
    29         if(a[i] != ' ' && a[i] != ',')
    30         {
    31              ++ b;
    32         }
    33         else if(b > 0) //为单词结束符号
    34         {
    35             if(b > maxn) 
    36             {
    37                  maxn = b;
    38                  c = i - b;//记录单词的头位置
    39             }
    40              if(b < minn) 
    41              {
    42                  minn = b;
    43                  d = i - b;
    44             }
    45             b = 0;//单词长度清0,开始计算下一个单词
    46         }
    47     
    48     }     
    49     //输出最长单词和最短单词
    50     for(int i = c; i <= c + maxn - 1; ++i)
    51         cout << a[i];
    52     cout << endl;
    53     for(int i = d; i <= d + minn - 1; ++i)
    54         cout << a[i];
    55     return 0;    
    56 }

    三、为什么会出现运行时错误

    runtime error可能的原因

    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); *p=10;
    
    ⑤数组开得太大,超出了栈的范围,造成栈溢出:int a[100000000];一般来说,在
    

    oj上做题都把数组设成全局变量,减少5出现的可能。

    有的时候再出现这样的错误还会给提示
    
    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              系统栈过载 
    

    这样可以照着上面查找错误。

    解答:

    出现runtime error的原因是  数组越界访问,原因是因为没有非下面的c赋初值,

     8     int minn = 110, maxn = 0, c, d, e, q = 0, b = 0;

    多组数据下,一定会造成数组的越界访问的

    50     for(int i = c; i <= c + maxn - 1; ++i)
    51         cout << a[i];
    52     cout << endl;
     
  • 相关阅读:
    [leetcode-79-Word Search]
    [leetcode-563-Binary Tree Tilt]
    [leetcode-561-Array Partition I]
    [leetcode-556-Next Greater Element III]
    [leetcode-554-Brick Wall]
    [leetcode-557-Reverse Words in a String III]
    [leetcode-532-K-diff Pairs in an Array]
    dev 官网
    DataTable 设置primarykey 后进行 Merge操作
    对称矩阵 一个简单的小把戏
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/9336129.html
Copyright © 2020-2023  润新知