C++实现将一个字符串转化为double类型

本文介绍了一个C++函数stod,该函数可以将字符串转换为double类型,并详细解释了其实现过程,包括如何处理正负号、小数点及非法字符等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*题目:实现函数 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;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值