/*题目:实现函数 bool stod(char *str,double *s),若转化成功则返回true,并将结果保存在s指向的那块空间;否则返回false
*/
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
#define MAX_DOUBLE 65536
bool isDigit(char ch)
{
if(ch>='0' && ch<='9') return true;
return false;
}
bool stod(char *str,double *s)//将字符串转化为double类型
{
if(str==NULL || strcmp("",str)==0 || (*str!='+' && *str!='-' && !isDigit(*str)) )
{
return false;
}
int Sign=0;//Sign=0,表示无正负号,1表示正号,-1表示负号
double beforeDot=0.0;//整数部分
double afterDot=0.0;//小数部分
int count=0;//用于记录小数点的位数
int len=strlen(str);
bool isDot=false;//用于标记小数点是否已经出现
int i;
for(i=0;i<len;i++)
{
if(i==0 && Sign==0)//如果第一个数为正负号,排除正负号
{
if(*str=='+')//1表示正号
{
Sign=1;
continue;
}
else if (*str=='-')//-1表示负号
{
Sign=-1;
continue;
}
}
if(!isDot && str[i]=='.')//排除'.'
{
if(Sign!=0 && i==1)//如果第一个是符号,第二个是.,则出错
{
return false;
}
isDot=true;
continue;
}
if(isDigit(str[i]))//如果是数字
{
if(!isDot)//未出现小数点
{
beforeDot=beforeDot*10+str[i]-'0';
if(beforeDot>MAX_DOUBLE)//越界
{
return false;
}
}
else//如果已出现小数点
{
afterDot=afterDot*10+str[i]-'0';
count++;
}
}
else//如果在排除正负号和小数点外还出现了非数字符号,则返回false
{
return false;
}
}
while(count)
{
afterDot/=10;
count--;
}
if(isDot)//如果有小数点
{
*s=beforeDot+afterDot;
}
else
{
*s=beforeDot;
}
return true;
}
int main()
{
double d;
double *s=&d;
string str;
cout<<"input your str:"<<endl;
cin>>str;
if(stod(const_cast<char*>(str.c_str()),s))
{
cout<<"after convert:"<<*s<<endl;
}
else
{
cout<<"invalid input!"<<endl;
}
return 0;
}