应该是while循环招致的.exe已停止工作,求指导是哪里出的错

应该是while循环导致的.exe已停止工作,求指导是哪里出的错
#include "stdafx.h"

#include <iostream>
#include <fstream>
#include <string>


#include <stdlib.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
bool isKey(string str);
bool isNum(string str);
bool isOper(string str);
bool isID(string str);

string SYM;
string NUM;
string ID;
string OPER;

int con=0;

ifstream fin("test.cpp");  
    string str;  

    while(fin>>str) 
    {    
cout<<str;

 
if (isKey(str))
{
string str2=str+"SYM";
SYM=SYM+" "+str2;
con=1;
cout<<"关键字:"<<str<<endl;
cout<<SYM<<endl;
continue;
}

if(isNum(str))
{
SYM=SYM+" "+"NUMBER";
NUM=NUM+" "+str;
con=2;
cout<<"数:"<<str<<endl;
continue;

}

if(isOper(str))
{
SYM=SYM+" "+"OPER";
OPER=SYM+" "+str;
con=3;
cout<<"运算符:"<<str<<endl;
continue;
}

if(isID(str))
{
SYM=SYM+" "+"IDENT";
ID=ID+" "+str;
con=4;
cout<<"标识符:"<<str<<endl;
continue;
}

if(con==0) 
{
cout<<"wrong input"<<endl;
continue;
}
  

}
fin.close();  

system("pause");
}
 

bool isKey(string str)
{
string key[]={"char","short","int","unsigned","long","float","double","struct","union","void","enum","signed","const","volatile","typedef","auto","register","static","extern","break","case","continue","default","do","else","for","goto","if","return","switch","while","sizeof","inline","catch","dynamic_cast","mutable","protected","true","false","namespace","public","try","bool","typename","class","delete","new","template","using","explicit","operator","reinterpret","cast","this","typeid","virtual","const_cast","friend","private","throw","static","cast","asm","wchar","export"};
int n=sizeof(key);
int i=0;
do
{
if (str==key[i])
return true;
i++;
}while(i<n);
if (i==n) return false;
}


bool isNum(string str)
{
int len=str.length();

for(int i=0;i<len;i++)
{
char ch=str[i]; 
if (ch<48||ch>57)
return false;
}
return true;
}


bool isOper(string str)
{
string cal[]={"+","-","+=","-=","&=","^=","|=","/=","<<=","%=","*=",">>=","-=","<&","^","|","%%","||",",","?:",".*","&","::","/","%","*","()","->","--","++","[]","==",">=","<=","<",">","!=","<<",">>","+","!","~"};
int n=sizeof(cal);
int i=0;
while(i<n)
{
if (str==cal[i])
return true;
i++;
}
if (i==n) return false;
}


bool isID(string str)
{
string first="_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
string following="_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

string::size_type pos; 

pos= first.find(str[0]);  
if(pos == first.npos) 
return false;

int len=str.length();
for (int i=1;i<len;i++)
{
pos= following.find(str[i]);
if(pos == first.npos) 
return false;
}

return true;


}


谢谢各位!!

------解决方案--------------------
string x[] = {...};
int len = sizeof(str);  ===>>>>>  WRONG !!!
------解决方案--------------------
sizeof(key);是数组中总字节数,而不是数组中的元素总个数.

如果想求得元素个数, 需要作个除法.

nCount = sizeof(key)/sizeof(key[0]);