【C/C++练习题】表示数值的字符串

《剑指Offer》面试题20:表示数值的字符串


1 题目

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

 

2 分析

表示数值的字符格式 A[.B[e|EC]],其中A表示整数部分、B表示小数部分、C表示指数部分。AC为带符号的整数,可以有'-'or'+'作为前缀,B为无符号整数。ABC之间有小数点'.' 和'e'区分。

 

3 代码

#include "iostream"
#include 

using namespace std;

//问题:判断字符串为表示数值的字符串
//整数部分[.小数部分[e/E指数部分]]
bool Is_number(char* str);
bool Is_unsigned_int(char** str);
bool Is_int(char** str);

//测试函数
void test01()
{
	char test01[] = "3.14";
	cout << "\"3.14\"		is	" << Is_number(test01) << endl;

	char test02[] = "3.14e11";
	cout << "\"3.14e11\"	is	" << Is_number(test02) << endl;

	char test03[] = "+3.14e-11";
	cout << "\"+3.14e-11\"	is	" << Is_number(test03) << endl;

	char test04[] = "3.14a11";
	cout << "\"3.14a11\"	is	" << Is_number(test04) << endl;
}


int main(int argc, char const *argv[])
{
	test01();
	return 0;
}



//功能:判断字符串表示数值
//输入:str 源字符串首地址
//返回:true 成功, false 失败
bool Is_number(char* str)
{
	//1.参数的合法性
	if (NULL == str)
		return false;

	//2.判断整数部分
	bool is_number = Is_int(&str);

	//3.判断小数部分
	if (*str == '.')
	{
		++str;
		//3.14 or 3.(0) or (0).14
		is_number = Is_unsigned_int(&str) || is_number;
	}

	//4.判断指数部分
	if (*str == 'E' || *str == 'e')
	{
		++str;
		//e前面必须有数值
		is_number = Is_int(&str) && is_number;
	}

	//5.返回结果
	return (*str == '\0' && is_number);
}

//功能:判断字符串表示整数(不带符号)
//输入:str 起始地址
//返回:true 成功, false 失败
bool Is_unsigned_int(char** str)
{
	const char* before = *str;	//保存首地址

	while ( **str != '\0' && **str >= '0' && **str <= '9' )
	{

		(*str)++;
	}

	return *str > before;
}


//功能:判断字符串表示整数(带符号)
//输入:str 起始地址
//返回:true 成功, false 失败
bool Is_int(char** str)
{
	if (**str == '+' || **str == '-')
	{
		(*str)++;
	}
	return Is_unsigned_int(str);
}

 

4 运行结果

【C/C++练习题】表示数值的字符串_第1张图片

你可能感兴趣的:(计算机基础-编程语言)