题目: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串“+100”、“5e2”、“-123”、“3.1416”及“-1E-16”都表示数值,但“12e”、“1a3.14”、“1.2.3”、“+-5”及“12e+5.4”都不是。
分析:
完整代码:
class Solution {
public:
bool isNumeric(char* string)
{
//输入合法性检验
if(string == nullptr)
return false;
//扫描整数部分
bool numeric = scanInteger(&string);
/************扫描小数部分**********/
//如果扫描到 '.',这后面出现的小数部分
if(*string == '.')
{
// 跳过符号 '.'
++string;
//判断是否符合小数规则
//小数点 '.' 前面可以有数字也可以没有数字
numeric = scanunsignedInteger(&string) || numeric;
}
/**********扫描指数部分**********/
//如果扫描到 'e' 或者 ’E',则后面出现的指数部分
if(*string == 'e' || *string == 'E')
{
//跳过符号 'e' 或者 ’E'
++string;
//判断是否符合指数部分规则
//指数符号 'e' 或者 ‘E'前面和后面必须都有数字
numeric = numeric && scanInteger(&string);
}
//遍历到结尾
return numeric && *string == '\0';
}
private:
//扫描无符号数
bool scanunsignedInteger(char** string)
{
//将当前的其实地址记录下来
const char* before = *string;
//当字符串没有到结尾时,且字符在 0~9之间
while(**string !='\0' && **string >= '0' && **string <='9')
//一直向下遍历
++(*string);
//若字符串中存在 0~9,则返回true;
return *string > before;
}
//扫描有符号数
bool scanInteger(char** string)
{
//如果以'+'或者’-‘开头
if (**string == '+'|| **string == '-')
//跳过当前的符号 '+' 或者’+‘
++(*string);
//扫描无符号整数
return scanunsignedInteger(string);
}
};