C++ 表示数值的字符串

问题:实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

求解本题时遇到的问题:

  1. 对题干理解不深,以为空格、小数点存在于任意位置;
  2. 小数点只能存在于E|e的前面,其后面只能跟整数;
  3. E|e的前面必须有数值;
  4. 正负号只能存在于开头及E|e后面;
  5. 面对问题时思维混乱,不成体系,导致漏洞百出。

本题的收获: 

  1. 遍历string字符串时,之前考虑的用char*,但不存在string到char*/char的转换;
    // 不存在从char(char*)到string的转换
    char  ch = s;    // !!不存在从 "std::string" 到 "char" 的适当转换函数
    char* ch = s;    // !!不存在从 "std::string" 到 "char *" 的适当转换函数
    
  2. 想通过for(char ch : s)进行遍历,但是循环内部会对循环的进度进行调整,用该方法不会更改for循环的进程,无法使用;
  3. 当将指针作为函数的参数时,其函数内只是一个拷贝,对其进行操作不会影响到外部参数,所以当使用char++进行递增时,并不是对string字符串进行遍历,而是根据ASCII进行遍历。

code: 

class Solution {
public:
    string::iterator ch;
    bool isNumber(string s) {
        ch = s.begin();
        if(s.empty()) return false;
        while(*ch == ' ') ++ch;
        bool numeric = scaninteger(ch);
        if(*ch == '.'){                 // 点前后任意位置有数字即可
            ++ch;
            numeric = scanunsignedinteger(ch) || numeric;
        }
        if(*ch == 'e' || *ch == 'E') {  // e前后均须有数字
            ++ch;
            numeric = numeric && scaninteger(ch);
        }
        while(*ch == ' ') ++ch;
        return numeric && *ch == '\0';
    }
    // 判断有无数字
    bool scanunsignedinteger(string::iterator &ch){
        auto before = ch;
        while(*ch != '\0' && *ch >= '0' && *ch <= '9') ++ch;
        return ch > before;
    }
    // 判断正负号是否合规及有无数字
    bool scaninteger(string::iterator &ch){
        if(*ch == '+' || *ch == '-') ++ch;
        return scanunsignedinteger(ch);
    }

};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值