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;
 
原文地址:https://www.cnblogs.com/Renyi-Fan/p/9336129.html