题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
解答:
#include<stdio.h>
#include<stdbool.h>
//判断是否是0~9之间的数,
//要对实参传进来的指针进行直接操作的话,就可以使用二级指针,把实参的地址传给二级指针,通过二级指针去改变一级指针的值。
bool scanfNumber(const char** str)
{
const char* before=*str;
while(**str!='\0'&&**str>='0'&&**str<='9')
++(*str);
return *str>before;
}
//判断是否有‘+’、‘-’
bool scanfInterget(const char** str)
{
if(**str=='+'||**str=='-')
++(*str);
return scanfNumber(str);
}
bool isNumber(const char* str)
{
if(str==NULL)
return false;
bool numberic=scanfInterget(&str);
//判断是否有.
if(*str=='.')
{
++str;
//三种情况
//1、小数可以没有整数部分,.123=0.123
//2、小数后面没有数字。123.=123.0
//3、正常整数和小数都有123.23
numberic=scanfNumber(&str)||numberic;
}
//判断是否有e、E
if(*str=='e'||*str=='E')
{
++str;
//&&原因
//1、当e或者E前,没有数字,错误:.e、e、-e
//2、当e或者E后,没有整数12e、12e+5.4
numberic=numberic&&scanfInterget(&str);
}
return numberic&&*str=='\0';//判断字符串是否匹配完,如果还有未匹配的字符,一定错误
}
int main(int argc, const char *argv[])
{
const char str[]={"123.1.1"};
if (isNumber(str))
printf("True!\n");
else
printf("False!\n");
return 0;
}