首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

贴:0x52F1FC45 (msvcr110d.dll) (Project1.exe 中)处的第一机会错误

2013-07-04 
求助贴:0x52F1FC45 (msvcr110d.dll) (Project1.exe 中)处的第一机会异常求大神帮忙看下:一个超小型的c++词

求助贴:0x52F1FC45 (msvcr110d.dll) (Project1.exe 中)处的第一机会异常
求大神帮忙看下:
一个超小型的c++词法分析器
运行的时候总是出现这个错误:
0x52F1FC45 (msvcr110d.dll) (Project1.exe 中)处的第一机会异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突。

代码如下:
#include <iostream>
#include<string>
using namespace std;
#define  MAX 22          
char ch =' ';
string key[15]={"begin","end","if","then","else","while","write","read",
"do", "call","const","char","until","procedure","repeat"};
int Iskey(string c){         //关键字判断
   int i;
   for(i=0;i<MAX;i++) {
      if(key[i].compare(c)==0) return 1;
       } 
    return 0;
}
int IsLetter(char c) {        //判断是否为字母
    if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A'))) return 1;
    else return 0;
}
int IsDigit(char c){          //判断是否为数字
     if(c>='0'&&c<='9') return 1;
     else return 0;
}
void analyse(FILE *fpin){
    string arr="";          
    while((ch=fgetc(fpin))!=EOF) {
            arr="";        
         if(ch==' '||ch=='\t'||ch=='\n'){ }     
 
         else if(IsLetter(ch)){
                 while(IsLetter(ch)||IsDigit(ch)) {
 if((ch<='Z')&&(ch>='A')) ch=ch+32;   
                        arr=arr+ch;
ch=fgetc(fpin);
                 }
                 fseek(fpin,-1L,SEEK_CUR);    
 int temp;
 temp = Iskey(arr);
                 if (Iskey(arr)){cout<<arr<<"\t$关键字"<<endl;}     
                 else  cout<<arr<<"\t$普通标识符"<<endl;           
               }
      
            else if(IsDigit(ch)){
                  while(IsDigit(ch)||ch=='.'&&IsDigit(fgetc(fpin))){
                        arr=arr+ch;
                        ch=fgetc(fpin);


                       }
                  fseek(fpin,-1L,SEEK_CUR);
                  cout<<arr<<"\t$无符号实数"<<endl;  
             }
       else switch(ch){          
               case'+':
               case'-' :
               case'*' :
               case'=' :
               case'/' :cout<<ch<<"\t$运算符"<<endl;break;
               case'(' :
               case')' :
               case'[' :
               case']' :               
               case';' :
               case'.' :
               case',' :
               case'{' :
               case'}' :cout<<ch<<"\t$界符"<<endl;break;
               case':' :{ch=fgetc(fpin);
                        if(ch=='=') cout<<":="<<"\t$运算符"<<endl;
                        else {cout<<"="<<"\t$运算符"<<endl;;
                               fseek(fpin,-1L,SEEK_CUR);}
                        }break;
case'>' :{ch=fgetc(fpin);
                         if(ch=='=') cout<<">="<<"\t$运算符"<<endl;
                         if(ch=='>')cout<<">>"<<"\t$输入控制符"<<endl;
                         else {cout<<">"<<"\t$运算符"<<endl;
                             fseek(fpin,-1L,SEEK_CUR);}


                         }break;
               case'<' :{ch=fgetc(fpin);
                         if(ch=='=')cout<<"<="<<"\t$运算符"<<endl;
                         else if(ch=='<')cout<<"<<"<<"\t$输出控制符"<<endl;
                         else if(ch=='>') cout<<"<>"<<"\t$运算符"<<endl;
                         else{cout<<"<"<<"\t$运算符"<<endl;
                            fseek(fpin,-1L,SEEK_CUR);}
                        }break;
              default : cout<<ch<<"\t$无法识别字符"<<endl;
        }
    }
}
void main(){
   char in_fn[30];
   FILE * fpin;
   cout<<"请输入源文件名(包括路径和后缀名):";
   for(;;){
       cin>>in_fn;
//   strcpy(in_fn,)
       if((fpin=fopen(in_fn,"r"))!=NULL) break;
       else cout<<"文件路径错误!请输入源文件名(包括路径和后缀名):";
     }
   cout<<"\n********************分析如下*********************"<<endl;
   analyse(fpin);
   fclose(fpin);
   cout<<endl;
   cout<<"按任意键结束"<<endl;
   int a;
   cin>>a;
} 异常
[解决办法]
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。

[解决办法]
#define  MAX 22  string key[15]={"begin","end","if","then","else","while","write","read",
"do", "call","const","char","until","procedure","repeat"};
int Iskey(string c){         //关键字判断
   int i;
   for(i=0;i<MAX;i++) {
      if(key[i].compare(c)==0) return 1;       } 


    return 0;
}
Key[14]是"repeat",Key[15]不存在,多找找类似这样的地方 添加监视

[解决办法]
你明明只有 15 个关键字, 却把 MAX 定义成 22, 何意?
改成 #define  MAX 15 试试吧.

热点排行