题目:10606 小型计算器
我的代码
#include<bits/stdc++.h>
using namespace std;
//#define DEBUG
int arr[30][100];//数组
int var[30];//变量
void gint_do(){
char ch1,ch2,sym;
int num1,num2;
int *site1=NULL,*site2=NULL;
int arr1=0;
int arr2=0;
ch1=getchar();
while((ch1>'Z' || ch1<'A') && (ch1>'z' || ch1<'a')) ch1=getchar();
#ifdef DEBUG
printf(" --ch1=%c\n",ch1);
#endif
if(ch1>='a' && ch1<='z') scanf("%d",&num1),arr1=1;
#ifdef DEBUG
printf(" --num1=%d,arr1=%d\n",num1,arr1);
#endif
getchar();
sym=getchar();
#ifdef DEBUG
printf(" --sym=%c\n",sym);
#endif
getchar();
ch2=getchar();
while((ch2>'Z' || ch2<'A') && (ch2>'z' || ch2<'a') && (ch2>'9' || ch2<'0')) ch2=getchar();
#ifdef DEBUG
printf(" --ch2=%c\n",ch2);
#endif
if(ch2>='a' && ch2<='z') scanf("%d",&num2),arr2=1;
else if(ch2<='9' && ch2>='0'){
num2=ch2-'0';
arr2=2;
ch2=getchar();
while(ch2<='9' && ch2>='0') num2=num2*10+ch2-'0',ch2=getchar();
}
#ifdef DEBUG
printf(" --num2=%d,arr2=%d\n",num2,arr2);
#endif
if(arr1==0) site1=&var[ch1-'a'];
else site1=&arr[ch1-'A'][num1];
if(arr2==0) site2=&var[ch2-'a'];
else if(arr2==1) site2=&arr[ch2-'A'][num2];
else site2=&num2;
switch(sym){
case '=':*site1=*site2;break;
case '+':*site1+=*site2;break;
case '-':*site1-=*site2;break;
case '^':*site1^=*site2;break;
}
#ifdef DEBUG
printf("\t\t\t-> ",ch1);
#endif
printf("%d\n",*site1);
}
int main(){
#ifdef DEBUG
freopen("in.txt","r",stdin);
#endif
int n;
cin>>n;
getchar();
for(int i=1;i<=n;i++){
gint_do();
#ifdef DEBUG
printf("#%d End.\n",i);
#endif
}
#ifdef DEBUG
printf("\nThe End!");
#endif
return 0;
}
测试数据
输入
6
A = 1
B = A
c12 + 123
d31 - 15
d31 ^ c12
A = d31
输出
1
1
123
-15
-118
-118
我的问题
为什么我用c++11(Clang) 编译器可以过,用其他编译器只对了测试点2,用NOI编译器连测试点2都过不了,还Runtime Error?
共 3 条回复
好的,谢谢老师,改对了
你的程序中包含很多可能合法的空间,数组越界会访问本来不属于这个数组的空间,如果:
但是具体是哪种情况,不同的编译器在不同的环境下为每个数组开的空间位置是可能不一样的,甚至可能同一个编译器在操作不时间运行都不一样。
另外,每道题目是有相应的讨论区的。像这种具体题目的提问可以到这个题的讨论区,而不是在全局板块提问。
Clang
能过,我也不太清楚不同编译器之间的细节区别,如果其他老师了解这方面内容,会过来答复你。不过这不是学习重点,以后用C++
编译器或NOI
编译器就行,如果不能通过也没必要尝试别的编译器,因为正式考试的编译环境是给定的。