您的位置:首页 > Web前端

剑指Offer——表示数值的字符串

2016-05-23 19:45 369 查看
题目描述:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

例如字符串"+100"、"5e2"、"-123"、"3,14"及”-1E-16“都表示数值,但”12E“、”1A3.14“、"1.2.3"、"+-6"及”10e+o.5“都不是数值。

#include <iostream>
#include <stdio.h>
using namespace std;

bool isExponential(char **strings);
bool scanDigits(char **strings);

bool isNumberic(char *strings)
{
if(strings==NULL)
return false;
if(*strings=='+'||*strings=='-')//第一个字符为+/=
++strings;

bool numberic=true;//是否为一个整数

bool hasDigits=scanDigits(&strings);//引用传递参数
if(*strings!='\0')
{
//含有小数点
if(*strings=='.')
{
++strings;
//小数点之后紧跟着E/e
if(*strings=='e'||*strings=='E')
return false;
//小数点之后没有数字
if(!hasDigits&&*strings=='\0')
return false;

scanDigits(&strings);

//科学计数法表示的小数
if(*strings=='e'||*strings=='E')
numberic=isExponential(&strings);
}
else if(*strings=='e'||*strings=='E')
numberic==isExponential(&strings);
else
numberic=false;
}

return numberic&&*strings=='\0';
}
//遍历0-9数字
bool scanDigits(char **strings)
{
char *pBefore=*strings;
while((**strings)!=0&&(**strings>='0')&&(**strings<='9'))
++(*strings);
return *strings>pBefore;
}
bool isExponential(char **strings)
{
if(**strings!='e'&&**strings!='E')
return false;
++(*strings);//向后遍历

if(**strings=='+'||**strings=='=')
++(*strings);

//加号之后再无数字
if(**strings=='\0')
return false;

scanDigits(strings);

return(**strings=='\0')?true:false;
}
//测试程序
void Test(char *testname,char *str,bool expected)
{
if(testname!=NULL)
printf("%s begins:\n",testname);
if(isNumberic(str)==expected)
printf("Passed.\n");
else
printf("Failed.\n");

}
int main()
{
Test("test1","12.34e+6",true);
Test("test2","-1e-16",true);
Test("test3","1.2.3",false);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: