标签:0.12 字符串 接下来 情况 格式 off unsigned amp har
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
主要搞清楚表示数值的具体情况是怎么样的
A [.[B]] [e|E C] 或者 .B [e|E C]
其中,中括号表示可有可无。A和C可以是带符号数,B必须是无符号数。
搞清楚后,代码就不难写,一步步扫描。
class Solution { public: bool isNumeric(const char* str) { if(str == nullptr) return false; bool numeric = scanInteger(&str); // 如果出现‘.‘,接下来是数字的小数部分 if(*str == ‘.‘) { ++str; // 下面一行代码用||的原因: // 1. 小数可以没有整数部分,例如.123等于0.123; // 2. 小数点后面可以没有数字,例如233.等于233.0; // 3. 当然小数点前面和后面可以有数字,例如233.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‘; } bool scanUnsignedInteger(const char** str) { const char* before = *str; while(**str != ‘\0‘ && **str >= ‘0‘ && **str <= ‘9‘) ++(*str); // 当str中存在若干0-9的数字时,返回true return *str > before; } // 整数的格式可以用[+|-]B表示, 其中B为无符号整数 bool scanInteger(const char** str) { if(**str == ‘+‘ || **str == ‘-‘) ++(*str); return scanUnsignedInteger(str); } };
标签:0.12 字符串 接下来 情况 格式 off unsigned amp har
原文地址:https://www.cnblogs.com/shiganquan/p/9340882.html