C++的奇妙error

发布于 2020-03-05  35 次阅读


最近收到读者来信某位同学的错题,题目大意的话就是从一个以"."为结尾的句子中找出最短的单词

enmmmmmm

首先思考,然后思考,接着思考……我寻思着这么简单的题目也没什么能错的地方啊,自己拿他的程序跑一遍也是对的

于是决定祭出杀器,登录到隔壁巨佬的自建oj上请巨佬测了一波,完美的RE

我寻思着这样奇妙的错误我居然闻所未闻,看到这种错误我是吓得浑身发抖,大热天(并没有)的全身冷汗手脚冰凉,这个信奥还能不能好了(停停停)

总之经过我 询问百度 不断地钻研,终于得出一个奇妙的结论,一般的RE错误都是因为一下几个错误:1.暴栈2.越界 3. /0 或者%0

那么我们来贴出源代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
int main()
{
	char a[501];
	int  len;
	int m=0,n;
	int sum=0;
	gets(a);
	len=strlen(a);
	for(int i=0;i<len;i++)
	{
		if(a[i]!=' '&&a[i]!='.')
		{
			sum++;
		}
		else if(sum>0)
		{ 
		   if(sum>m)
		   {
		   	m=sum;
		   	n=i-sum;
			}
			sum=0;	
		}
	}
	for(int i=n;i<=m+n-1;i++)
	cout<<a[i];
	cout<<endl;
	return 0;
 }

我一看,这数组开的不大甚至可以说小,也不存在/0%0智障错误,那我们可以排除掉1 3错误

新机子挖一自摸一多姿,这个程序,它 越 界 了,呦西,这是为什么呢?经过测评,我们发现以下几个疑点:

1.在main函数中定义数组(存储读入的句子)长度501(刚好超过题目上限)时,显示RuntimeError

2.在main函数外定义数组长度501时,显示AC

3.在main函数内定义数组长度10000时,显示AC

翻阅各大巨佬的讲解都没能找到该问题的原理,那么我们只能得出结论:

死也别在main函数里开数组了


花开花败总归尘。 阴阳化生,清浊自分。