题目:实现一个函数判断字符串是否表示数值(包括小数和整数)。例如 +100 5e2 -123 3.1416 -1E-16都表示数值,单12e 1a3.14 1.2.3 +-5 12e5.4都不是
大体思路:先尽可能多的扫描0~9的数位(可能起始处有+或者-),如果遇到小数点,则开始扫描小数,遇到e或E,开始扫描指数部分
bool scanUnsignedInteger(const char** str)
{
const char* before = *str; //备份指针str的初始指向
while (*str != '\0'&&**str > '0'&&**str < '9')
(*str)++;
return *str > before;//若str起始部分有数字,返回true
}
bool scanSignedInteger(const char** str)
{
if (**str == '+' || **str == '-')
{
++(*str);
}
return scanUnsignedInteger(str);
}
bool isNumeric(const char* str)
{
if (str == nullptr)
{
return false;
}
if (*str == '+' || *str == '-')
++str;
bool numeric = scanUnsignedInteger(&str); //指针str作为实参传递时候,的指向在scanUnsignedInteger发生了改变
//而我们又希望实参也因此改变
if (*str == '.')
{
++str;
numeric = scanUnsignedInteger(&str) || numeric;
//这里用||的原因是:可能有.123的这种小数,会使得之前的numeric是false
}
if (*str == 'e' || *str == 'E')
{
++str;
numeric = scanSignedInteger(&str) && numeric;
}
return numeric&&*str=='\0';//最后还要判断*str是否等于'\0',因为要是"1245qwer"这种numeric也是true
}