/*科学:空格(0-n) 数字 e/E 数字
小数:空格(0-n) +/-(0-1) 数字(0-n) . 数字(0-n) 空格
整数: 空格(0-n) +/-(0-1) 数字(1-n) 空格
整数:1.空格++/-+数字+空格
2.空格+ 数字 +空格
3.+/- +数字+空格
4.数字+空格
小数:1. 空格 + +/- +数字 +.+空格
2.空格++/- + 数字+ . +数字+空格
3.空格+ +/- +.+数字+空格
4.+/-+
5.
科学:1.空格+小数/整数+e+整数+空格
0.空格 0 +/- 1 数字 2 . 3
1.数字 2 . 3
2.数字 2 .4 空格 8 e 5
3.数字 4
4.数字 4 空格 8 e 5
5.+/- 6 数字 7
6.数字 7
7.数字 7 空格 8
8.空格 8*/
bool isNumeric(char* str ) {
//错误1:丢了states[0][2]
char states[9][5]={" sd.","d.","d.e ","d","de ","sd","d","d "," "};
int next[9][4]={{0,1,2,3},{2,3},{2,4,5,8},{4},{4,5,8},{6,7},{7},{7,8},{8}};
int index=0;
int j;
for(int i=0;i<strlen(str);i++){
//错误2:忘记字符转换成对应的类型符号。
char item;
if(str[i]>='0'&&str[i]<='9') item='d';
else if(str[i]=='+'||str[i]=='-') item='s';
else if(str[i]=='e'||str[i]=='E') item='e';
else item=str[i];
//错误3:由于在for中有定义了int j导致
//int j=0;
for(j=0;j<strlen(states[index]);j++){
if(item==states[index][j])
break;
}
}
if(j==strlen(states[index])) return false;
//错误4:在j的for循环中进行下面复制操作出错,因为上面的if判断会出问题。index已经改变。
index=next[index][j];
}
//错误5:第一次直接return true不正确,因为 "+"这样的字符不符合终止条件
//第二次 if(index==8) return true;也不正确,因为'5e2'
if(index==2||index==4||index==7||index==8) return true;
else return false;
}