剑指offer:表示数值的字符串

剑指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
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值