表示数值的字符串

剑指offer

Posted by chl on January 11, 2019

题目描述

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

解法

分析数值的表示为: A [ . [ B ] ] [ e | E C ]; A为小数点前的有符号整数,B为小数点后的无符号整数,C为E|e后面的有符号整数; 例子:123.45e+6; .123; 123.; 12e-5;+4e-5; 注: .前后可以有一边没数字,e|E前后必须都有数字; ## 代码

//扫描无符号整数
bool scanUInter(char **str) {
	bool flagNum = false;
	while (**str!='\0' && **str >= '0' && **str <= '9') {
		++(*str);
		flagNum = true;
	}
	return flagNum;
}

//扫描符号整数
bool scanInter(char **str) {
	if (**str!= '\0' && **str == '+' || **str == '-') {
		(*str)++;
	}
	return scanUInter(str);
}

bool isNumber(char *str) {
	if (str == nullptr) {
		return false;
	}

	bool isnum = scanInter(&str); //先扫描A;

	if (*str == '.') { //扫描B
		str++;
		/*
		.123
		456.
		.前无数字,或者前面有数字,.后无数字都可以,但不能只有.
		*/
		isnum = scanUInter(&str) || isnum;
	}

	if (*str == 'e' || *str == 'E') { //扫描C;
		str++;
		/*
		e前面没数字时,是错误的;如 e12;
		e后没数字也是错误的,123.e,123.3e;
		*/
		isnum = scanInter(&str) && isnum;
	}
	return isnum && *str=='\0';
}