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,也报运行时错误,原因可能是 字符串没有被访问完全而再次访问,也就是说字符串没有访问到'\0'。
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]=='\0'){ 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;
版权申明:欢迎转载,但请注明出处
一些博文中有一些参考内容因时间久远找不到来源了没有注明,如果侵权请联系我删除。
在校每年国奖、每年专业第一,加拿大留学,先后工作于华东师范大学和香港教育大学。
2025-04-30:宅加太忙,特此在网上找女朋友,坐标上海,非诚勿扰,vx:fan404006308
AI交流资料群:753014672