Sword Finger Offer Question 20— 숫자 값을 나타내는 문자열

숫자 값을 나타내는 문자열

제목 : 문자열이 값 (정수 및 소수 포함)을 나타내는 지 확인하는 함수를 구현하세요.
예 : 문자열 "+100", "5e2", "-123", "3.1416"및 "-1E-16" 모두 숫자 값을 의미
하지만 "12e", "1a3,14", "1.2.3", "± 5"및 "± 5"및 "12e5.4"는 그렇지 않습니다.

표현 모드

표시된 값의 문자열 패턴은
A [. [B]] [e | EC] 또는 .B [e | EC] 로 결론을 내릴 수 있습니다 .
여기서 A는 값의 정수 부분이고 B 뒤에 소수점이 있습니다. 값의 소수 부분입니다. 바로 뒤에 'e'또는 'E'가 오는 C는 값의 지수 부분입니다.
10 진수 값의 정수 부분이 없을 수 있습니다. 예를 들어 십진수 .123은 0.123과 같습니다. 따라서 A 부분은 필요하지 않습니다. 숫자에 정수 부분이 없으면 소수 부분은 비워
수 없습니다. 위의 A와 C는 모두 "+"또는 "-"로 시작할 수있는 0-9 자리 문자열입니다. ; B도 0 ~ 9의 숫자 문자열이지만 앞에 부호가 없을 수 있습니다.

방법

문자열이 위의 패턴을 따르는 지 판단 할 때 먼저 0에서 9까지 가능한 한 많은 숫자를 스캔합니다 (처음에는 '+'또는 '-'가있을 수 있음). 즉, 패턴에서 구매하는 돈입니다. 숫자 정수 파트 A를 나타냅니다.
소수점 '.'을 만나면 값의 소수점을 나타내는 B 부분 스캔을 시작합니다. 'e'또는 'E'를 만나면 C 부 스캔 시작

암호

bool isNumberic(const char* str)
{
    
    
	if(str==nullptr)
		return false;
	
	bool numeric=scanInteger(&str);
	
	//如果出现'.',则接下来时数字的小数部分
	if(*str=='.')
	{
    
    
		++str;
		/*下面一行代码用||的原因
		1、小数可以没有整数部分
		2、小数点后面可以没有数字,如233.和2333.0
		3、当然,小数点前面和后面可以都有数字,如2333.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';
}

//用来扫描字符串中0~9的数位,可以用来匹配前面数值模式中的B部分
bool scanUnsignedInteger(const char** str)
{
    
    
	const char* before=*str;
	while(**str!='\0' && **str>='0' && **str<='9')
	++(*str);
	//当str中存在若干0~9的数字时,返回true
	return *str>before;
}
//扫描可能以表示正负的'+'或者'-'为起始的0~9的数位(类似一个可能带正负符号的整数)
bool scanInteger(const char** str)
{
    
    
	if(**str=='+' || **str=='-')
		++(*str);
	return scanUnsignedInteger(str);
}

——————————————————————————————————————————— ——
참고서 "Sword Finger Offer"

추천

출처blog.csdn.net/rjszz1314/article/details/104240791