剑指offer面试题20--表示数值的字符串

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

大体思路:先尽可能多的扫描0~9的数位(可能起始处有+或者-),如果遇到小数点,则开始扫描小数,遇到e或E,开始扫描指数部分

bool scanUnsignedInteger(const char** str)
{
	const char* before = *str;   //备份指针str的初始指向
	while (*str != '\0'&&**str > '0'&&**str < '9')
		(*str)++;

	return *str > before;//若str起始部分有数字,返回true

}

bool scanSignedInteger(const char** str)
{
	if (**str == '+' || **str == '-')
	{
		++(*str);

	}
	
	return scanUnsignedInteger(str);

}

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

	if (*str == '+' || *str == '-')
		++str;

	bool numeric = scanUnsignedInteger(&str);  //指针str作为实参传递时候,的指向在scanUnsignedInteger发生了改变
	//而我们又希望实参也因此改变

	if (*str == '.')
	{
		++str;
		numeric = scanUnsignedInteger(&str) || numeric;
		//这里用||的原因是:可能有.123的这种小数,会使得之前的numeric是false
	}

	if (*str == 'e' || *str == 'E')
	{
		++str;
		numeric = scanSignedInteger(&str) && numeric;
	}

	return numeric&&*str=='\0';//最后还要判断*str是否等于'\0',因为要是"1245qwer"这种numeric也是true
}

猜你喜欢

转载自blog.csdn.net/qq_34793133/article/details/80897702