《剑指offer》:[54]表示数值的字符串

题目:请实现1个函数用来判断字符串是不是表示数值(包括整数和小数)。
例如,字符串“+100”,“5e2”,“⑴23”,“3.1416”及”⑴E⑴6”都表示数值,但“12e”,”1a3.14”,”1.2.3”,”+⑸”及“12e+5.4”都不是。 

分析:这个题主要是利用数字的表示通式来解决:表示1个数字的通式为:
                           [sign]integral-digits[.[fractional-digits]][e|E[sign]exponential-digits]('[‘和’]’之间的数据都是可有可无的,可省略)
表达的意思是:[符号]整型数字[小数点[小数整数]][e|E[指数的符号]指数的整数表示].依照这个步骤思路来判断就不会错。
   看1个字符串是不是符合上述模式时,首先看第1个字符是否是正负号。如果是,在字符串上移动1个字符,继续扫描剩余的字符串中0到9的数位。如果是1个小数,则可能遇到小数点。另外如果是科学计数法,则在小数点的后面可能遇到e|E。
具体实现代码以下:

#include <iostream>
using namespace std;
void ScanDigits(char **str) //判断是不是是0⑼之间的数字;
{
while(**str!='\0' && **str>='0' && **str<='9')
++(*str);
}
bool IsExponential(char **str)//判断e或E以后的表达式是不是合法:符号+数字;
{
if(**str!='e' && **str!='E')
return false;
++(*str);
if(**str=='+' || **str=='-')
++(*str);
if(**str=='\0')
return false;
ScanDigits(str);
return (**str=='\0')?true:false;
}
bool IsNumber(char *str)
{
if(str==NULL)
return false;
if(*str=='+' || *str=='-') //判断符号;
++str;
if(*str=='\0')
return false;
bool numeric=true;
ScanDigits(&str);
if(*str!='\0')
{
//如果是浮点数;
if(*str=='.')
{
str++;
ScanDigits(&str);
if(*str=='e' || *str=='E')
numeric=IsExponential(&str);
}
//如果是整型数的科学计数法;
else if(*str=='e' || *str=='E')
numeric=IsExponential(&str);
else
numeric=false;
}
return numeric && *str=='\0';
}
int main()
{
char *strr[4]={"5e2","⑴E⑴6","12e+5.4","12e"};
for(int i=0;i<4;i++)
{
if(IsNumber(strr[i]))
cout<<strr[i]<<": YES!"<<endl;
else
cout<<strr[i]<<": NO!"<<endl;
}
system("pause");
return 0;
}

运行结果:

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » 《剑指offer》:[54]表示数值的字符串

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡