题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
解题思路:数字的格式可以用A[.[B]][e|EC]或者.B[e|EC]表示,其中A和C都是整数(可以有正负号,也可以没有),而B是一个无符号整数。注意A部分可以不存在。
#include<iostream> using namespace std; bool scanUnsignedInteger(char** str); bool scanInteger(char** str); // 数字的格式可以用A[.[B]][e|EC]或者.B[e|EC]表示,其中A和C都是 // 整数(可以有正负号,也可以没有),而B是一个无符号整数 bool isNumeric(char* string) { if (string == nullptr) return false; bool numeric = scanInteger(&string); if (*string == '.') { ++string; numeric = scanUnsignedInteger(&string) || numeric; } if (*string == 'e' || *string == 'E') { ++string; numeric = numeric && scanInteger(&string); } return numeric && *string == '\0'; } bool scanInteger(char** str) { if (**str == '+' || **str == '-') ++(*str); return scanUnsignedInteger(str); } bool scanUnsignedInteger(char** str) { const char* begin = *str; while (**str != '\0'&&**str >= '0' && **str <= '9') ++(*str); return *str > begin; } int main() { char str[] = "1.54e3"; cout << isNumeric(str); }