剑指offer(面试题20):表示数值的字符串

解法
  • 分析:确定数值的匹配模式
  • 注意:二级指针的使用容易出错
/*
* 判断输入的字符串是否表示数值
* [+|-][.[0-9]][e|E[0-9]]
*/
#include <iostream>
using namespace std;


// 扫面[0-9]
bool scanUnsignedInteger(const char** str) {
  const char* before = *str;
  while(**str != '\0' && **str >= '0' && **str <= '9')
    ++(*str);

  // 当str中存在0-9的数字时,返回true(这时str所指的地址增加,即往后移动)
  return *str > before;
}

// 扫描整数
bool scanInteger(const char** str) {
  if(**str == '+' || **str == '-')
    ++(*str); //移到下一个字符
  return scanUnsignedInteger(str);
}

bool isNumeric(const char* str) {
    if(str == NULL ) return false;

    bool numeric = scanInteger(&str); //传入的是指针的指针,会改变指针指向的值,但不是改变指针本身
    if(*str == '.') {
      ++str;
      numeric = scanUnsignedInteger(&str) || numeric;
    }
    if(*str == 'e' || *str == 'E') {
      ++str;
      numeric = numeric && scanInteger(&str);
    }
    return numeric&& *str == '\0';
  }

int main(int argc, char const *argv[]) {
  char a[] = ".123";
  cout << isNumeric(a) << endl;
  char a1[] = "8.123";
  cout << isNumeric(a1) << endl;
  char a2[] = "8.123e+123";
  cout << isNumeric(a2) << endl;
  char a3[] = "+8.123E-123";
  cout << isNumeric(a3) << endl;
  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值