#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;
}
劍指offer--面試題20:表示數值的字符串
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.