劍指offer--面試題20:表示數值的字符串

#include <stdio.h>
#include<iostream.h>

bool scanUnsignedInteger(const char** str) //判斷是否是0-9之間的數字;
{
    const char* before = *str;
    while(**str != '\0' && **str >= '0' && **str <= '9')
        ++(*str);

    // 當str中存在若干0-9的數字時,返回true
    return *str > before;
}

// 整數的格式可以用[+|-]B表示, 其中B爲無符號整數
bool scanInteger(const char** str)
{
    if(**str == '+' || **str == '-')
        ++(*str);
    return scanUnsignedInteger(str);
}

// 數字的格式可以用A[.[B]][e|EC]或者.B[e|EC]表示,其中A和C都是
// 整數(可以有正負號,也可以沒有),而B是一個無符號整數
bool isNumeric(const char* str)
{
    if(str == NULL)
        return false;

    bool numeric = scanInteger(&str);

    // 如果出現'.',接下來是數字的小數部分
    if(*str == '.')
    {
        ++str;

        // 下面一行代碼用||的原因:
        // 1. 小數可以沒有整數部分,例如.123等於0.123;
        // 2. 小數點後面可以沒有數字,例如233.等於233.0;
        // 3. 當然小數點前面和後面可以有數字,例如233.666
        numeric = scanUnsignedInteger(&str) || numeric;
    }

    // 如果出現'e'或者'E',接下來跟着的是數字的指數部分
    if(*str == 'e' || *str == 'E')
    {
        ++str;

        // 下面一行代碼用&&的原因:
        // 1. 當e或E前面沒有數字時,整個字符串不能表示數字,例如.e1、e1;
        // 2. 當e或E後面沒有整數時,整個字符串不能表示數字,例如12e、12e+5.4
        numeric = numeric && scanInteger(&str);
    }

    return numeric && *str == '\0';
}



int main()
{
    char *strr[10]={"+100","5e2","-123","3.1416","-1E-16","12e","1a3.140","1.2.3","+-5","12e+5.4"};  
    for(int i=0;i<10;i++)  
    {  
        if(isNumeric(strr[i]))  
            cout<<strr[i]<<":  YES!"<<endl;  
        else  
            cout<<strr[i]<<":  NO!"<<endl;  
    }    
    return 0;  

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章