题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。
解法
分析数值的表示为: A [ . [ B ] ] [ e | E C ]; A为小数点前的有符号整数,B为小数点后的无符号整数,C为E|e后面的有符号整数; 例子:123.45e+6; .123; 123.; 12e-5;+4e-5; 注: .前后可以有一边没数字,e|E前后必须都有数字; ## 代码
//扫描无符号整数
bool scanUInter(char **str) {
bool flagNum = false;
while (**str!='\0' && **str >= '0' && **str <= '9') {
++(*str);
flagNum = true;
}
return flagNum;
}
//扫描符号整数
bool scanInter(char **str) {
if (**str!= '\0' && **str == '+' || **str == '-') {
(*str)++;
}
return scanUInter(str);
}
bool isNumber(char *str) {
if (str == nullptr) {
return false;
}
bool isnum = scanInter(&str); //先扫描A;
if (*str == '.') { //扫描B
str++;
/*
.123
456.
.前无数字,或者前面有数字,.后无数字都可以,但不能只有.
*/
isnum = scanUInter(&str) || isnum;
}
if (*str == 'e' || *str == 'E') { //扫描C;
str++;
/*
e前面没数字时,是错误的;如 e12;
e后没数字也是错误的,123.e,123.3e;
*/
isnum = scanInter(&str) && isnum;
}
return isnum && *str=='\0';
}