class Solution {
public:
bool scanUnsignedInteger(char** str){
//检测数值部分,利用检测前和检测后的指针是否移动来判断时候有数值
const char* before = *str;
while(**str!='\0' && **str >= '0' && **str <= '9'){
(*str)++;
}
return *str>before;
}
bool scanInteger(char** str){
//检测AC部分时候先去掉+-号,然后直接检测有没有数字就行了
if(**str == '+' || **str == '-')
(*str)++;
//特别注意此处用if而不是while来判断+-号,避免会有多个+-号连在一起,这样也是错误情况来着
return scanUnsignedInteger(str);
}
bool isNumeric(char* str)
{
/*我们把表示数值的字符串的形式归结为[A][.B][e|EC]
A表示整数部分,且A不是必须的,B是小数部分,C是指数部分
并且,A和C可以带有+-号,因此当匹配的时候有+-号先去掉正负号
剩下的ABC都是数值,而且当匹配C的时候,E前面必须有值
*/
if(str == nullptr)
return false;
//首先判断A部分,判断是否有整数部分
bool numeric = scanInteger(&str);
if(*str == '.'){
//如果接下来是.,那就判断B部分
//因此判断B部分的时候,A可以不存在,即.123=0.123
//也可以A存在B不存在,即123.=123
//也可以两者都存在,即123.123
//所以此处用||
str++;
//特别注意,在或运算中,此处一定要先执行scanUnsignedInteger(&str)函数
//必须让其将B部分的数字扫描完毕才能让下一次检测C正确的执行
//一定要把它放在或运算的左边,否则会因为numeric为真不执行此函数
numeric = scanUnsignedInteger(&str) || numeric ;
}
if(*str == 'e' || *str == 'E'){
//判断完整数和小数就判断一下指数部分
//因为指数部分要求e前面一定要有数字,e后也得有数字
//因此此处要用&&
str++;
numeric = numeric && scanInteger(&str);
}
//最后还要判断是否str已经匹配完毕了
return numeric && *str == '\0';
}
};