剑指offer:表示数值的字符串
题目: 实现一个函数用来判断字符串是否表示数值(包括整数和小数).
例如,字符串"+100","5e2", "-123","3.1416","-1E-16"。
思路:1.使用正则表达式
2.普通方法
具体的坑见代码!
class Solution {
public:
// bool isNumeric(char* string)
// {
// regex pattern("[+-]?[0-9]*(\\.[0-9]*)?([eE][+-]?[0-9]+)?$");
// return regex_match(string, pattern);
// }
bool isNumeric(char* string)
{
if (string == nullptr) return false;
bool numeric = scansigned(&string); //numeric标示着是否合法
if (*string == '.')
{
++string;
numeric = scanunsigned(&string) || numeric; //注意短路!!!如果顺序互换,就无法将指针string移到下一位。
}
if (*string == 'E' || *string == 'e')
{
++string;
numeric = scansigned(&string) && numeric; //注意短路
}
return numeric && *string == '\0';
}
bool scansigned(char** str) //返回值:是否为带符号的整数;其他功能:将*str 指向连续数字区的下一位
{
if (**str == '+' || **str == '-') (*str) ++;
return scanunsigned(str);
}
bool scanunsigned(char** str) //返回值:是否为不带符号的整数;其他功能:将*str指向连续数字区的下一位
{
char* before = *str;
while (**str != '\0' && **str >= '0' && **str <= '9')
{
(*str)++;
}
return *str > before; //*str > before说明有数字,返回true
}
};