《劍指offer》:[54]表示數值的字串

塵虛緣_KY發表於2016-06-28
題目:請實現一個函式用來判斷字串是否表示數值(包括整數和小數)。
例如,字串“+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;
}

執行結果:


相關文章