码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-06-29 11:28:00      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

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

分析:这个题主要是应用数字的表示通式来解决:表示一个数字的通式为:
                           [sign]integral-digits[.[fractional-digits]][e|E[sign]exponential-digits](‘[‘和‘]‘之间的数据都是可有可无的,可省略)
表达的意思是:[符号]整型数字[小数点[小数整数]][e|E[指数的符号]指数的整数表示].按照这个步骤思路来判断就不会错。
   看一个字符串是否符合上述模式时,首先看第一个字符是不是正负号。如果是,在字符串上移动一个字符,继续扫描剩余的字符串中0到9的数位。如果是一个小数,则可能遇到小数点。另外如果是科学计数法,则在小数点的后面可能遇到e|E。
具体实现代码如下:
#include <iostream>
using namespace std;
void ScanDigits(char **str) //判断是否是0-9之间的数字;
{
	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","-1E-16","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;
}

运行结果:

技术分享

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

标签:

原文地址:http://blog.csdn.net/gogokongyin/article/details/51776292

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!