这道题写起来比较繁琐,需要考虑+-号是否出现在第一个位置,.是否出现一次,以e为分割前后是不是正确的格式,e前可以为浮点数或者整数,e后只能是整数。
因此如果把函数分成三个子函数来写就好多了,一个函数判断是不是整数,一个判断是不是浮点数,一个判断e前后是否合法。
#include <stdio.h>
#include <windows.h>
bool is_znum(char *string)
{
int first = 1;
while (*string != '\0' && *string != 'e' && *string != 'E') {
if(*string == '+' || *string == '-'){
if (first) {
first = 0;
string++;
}
else return false;
}
else if (isdigit(*string)) {
string++;
first = 0;
}
else return false;
}
return true;
}
bool is_fnum(char* string)
{
int first = 1;
while (*string != '\0' && *string != 'e' && *string != 'E') {
if (*string == '+' || *string == '-') {
if (first) {
first = 0;
string++;
}
else return false;
}
else if (isdigit(*string)) {
first = 0;
string++;
}
else if (*string == '.') {
string++;
if (*string !='\0' && isdigit(*string)) {
if (is_znum(string)) {
return true;
}
return false;
}
else return false;
}
else return false;
}
return false;
}
//分为e之前,e之后判断
bool isNumeric(char* string)
{
if(string == NULL)
return false;
//e之前可以是整数或者浮点数
if (is_znum(string) || is_fnum(string)) {
while (*string != '\0' && (*string != 'e' && *string != 'E')) {
string++;
}
if (*string == '\0')
return true;
//e之后只能跟整数并且不为空
if (*string == 'e' || *string == 'E') {
string++;
if (*string == '\0') {
return false;
}
if (is_znum(string)) {
return true;
}
else return false;
}
return false;
}
else return false;
}
int main()
{
char arr[] = "+3.14e-12";
int ret = isNumeric(arr);
}