[C语言 LeetCode 剑指 Offer 20] 表示数值的字符串

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

例如:
字符串"+100"、“5e2”、"-123"、“3.1416”、"-1E-16"、"0123"等表示数值,
“12e”、“1a3.14”、“1.2.3”、"±5"及"12e+5.4"都不是

判断是否为数字型字符串模块C代码:

bool isNumber(char* s)
{
    int i=0,n=0,k=0,t=0;
    for(i=0;s[i]==' ';++i);          //跳过字符串开头空格
    if(s[i]=='e'||s[i]=='E')         //空格之后是‘e’或‘E’返回非数字型
        return false;
    while(s[i]!='\0'&&(s[i]<'0'||s[i]>'9'))         //判断剩余字符是否有数字
        ++i;
    if(s[i]=='\0')                 //无数字返回非数字型
        return false;
    for (i=0;s[i]!='\0';++i)
    {
        while(s[i]==' ')          //跳过字符串开头空格
            ++i;
        if(s[i]=='\0')           //字符串访问结束退出循环
            break;
        if(s[i]=='.')           //处理小数点
        {
            if(k==0)           //访问该小数点前未出现小数点
                ++k;           //记录小数点标志位加1
            else               //出现则返回非数字型
                return false;
            if(((s[i+1]<'0'||s[i+1]>'9')&&s[i+1]!='\0')||t>0)           //小数点之后非数字且小数点不是最后一个字符或者‘e’或‘E’个数大于1
                return false;          //返回非数字型
        }//if
        else if(s[i]=='+'||s[i]=='-')          //处理‘+’‘-’
        {
            if(n<2//访问之前‘+’‘-’出现次数小于2,标志位加1
                ++n;
            else            //返回非数字
                return false;
            if((s[i+1]<'0'||s[i+1]>'9')&&s[i+1]!='.')          //‘+’‘-’之后不是小数点或数字
                return false;         //返回非数字型
        }//else if
        else if(s[i]=='e'||s[i]=='E')        //处理‘e’‘E’
        {
            if(t<1)       //访问之前‘e’‘E’出现次数小于1,标志位加1
                ++t;
            else          //返回非数字型
                return false;
            if((s[i+1]<'0'||s[i+1]>'9')&&s[i+1]!='+'&&s[i+1]!='-')          //‘e’‘E’之后不是‘+’或‘-’或数字
                return false;
        }//else if
        else if(s[i]>='0'&&s[i]<='9')           //返回非数字型
        {
            while(s[i+1]==' '&&s[i+1]!='\0')           //处理数字之后的空格 
            {
                ++i;
                if((s[i+1]>='0'&&s[i+1]<='9')||s[i+1]=='.'||s[i+1]=='e'||s[i+1]=='E')         //空格之后为数字,小数点,‘+’,‘-’,‘e’,‘E’
                    return false;          //返回非数字型
            }//while
            if(s[i+1]=='.'&&s[i+1]!='\0')          //处理数字之后的小数点
            {
                ++i;
                ++k;          //小数点标志位加1
                if(k>1||t>0)           //小数点个数大于1或‘e’或‘E’个数大于0
                    return false;          //返回非数字型
                while(s[i+1]==' '&&s[i+1]!='\0')          //处理小数点后的空格
               {
                  ++i;
                  if((s[i+1]>='0'&&s[i+1]<='9')||s[i+1]=='.'||s[i+1]=='e'||s[i+1]=='E')          //空格之后为数字,小数点,‘+’,‘-’,‘e’,‘E’
                      return false;          //返回非数字型
              }//while
            }//if
            else if(s[i+1]=='+'||s[i+1]=='-')      //数字之后为‘+’,‘-’
                return false;            //返回非数字型
        }//else if
        else 
            return false;          //非以上字符返回非数字
    }//for
    return true;                   //循环结束放回数字型
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值