面试题1:把一个字符串转换成数字

1题目分析:

构思过程:

分析方法:写代码前想好测试用例,考虑所有可能的输入,并做相应的处理。这样的程序才有健壮性!

测试用例:char *p[8]={"123","123.45","A123.45","-123.45","+123.45","12A.45","123.A5",NULL};//测试用例

保证所有异常输入是返回0,正常输入时,转换为数字。


基本思路:

1.用Char*实现

空指针判断--变量定义--符号判断--整数部分--是否包含小数部分-小数部分--符号判断--返回值。(注意全程关于异常的判断)

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
//-------------------------------------------------------------------char str_to_num
double str_to_num(char *p1)
{
	double num1=0,num2=0;//变量定义
	char flag='+';
	if (p1==NULL)//空指针判断及符号判断
	{
		return 0;
	}
	else if (*p1=='-')
	{
		flag='-';
		++p1;
	}
	else if (*p1=='+')
	{
		++p1;
	}
	else if (*p1>'9'||*p1<'0')
	{
		return 0;
	}

	char *p2=p1+strlen(p1)-1;//尾指针

	

	while(*p1!='.'&&*p1!='\0')//整数部分
	{
		if (*p1>'9'||*p1<'0')
		{
			return 0;
		}
		num1=num1*10+*(p1++)-'0';
	}
	if (*p1=='\0')
	{
		return num1;
	}
	 while(*p2!='.')   //小数部分
	 {
		 if (*p2>'9'||*p2<'0')
		 {
			 return 0;
		 }
		 num2=num2/10+*(p2--)-'0';
	 }
	 num2/=10;
	 if (flag=='-')
	 {
		 return -(num1+num2);
	 }
	 else
		 return num1+num2;
}

int main()
{
	
	char *p[8]={"123","123.45","A123.45","-123.45","+123.45","12A.45","123.A5",NULL};//测试用例
	double result[8]={0};
	double *p1=&result[0];
	double *p2=p1,*p3=p1;
	for (int i=0;i<8;++i)
	{

		result[i]=str_to_num(p[i]);
		if (p[i]==NULL)
		{
			cout<<result[i]<<endl;
		}
		else
		cout<<p[i]<<" :  "<<result[i]<<endl;
	}
	system("pause");
	return 0;
}

2.用string实现

double str_to_num(string str)
{
	double num1=0,num2=0;
	char flag='+';
	int int_index=0;

	if (str.empty())
	{
		return 0;
	}
	else if (str[int_index]=='-')
	{
		flag='-';
		int_index++;
	}
	else if (str[int_index]!='+'&&(str[int_index]>'9'&&str[int_index]<'0'))
	{
		return 0;
	}
	else if (str[int_index]=='+')
	int_index++;	

	while(int_index!=str.size()&&str[int_index]!='.' )//容易溢出
	{
		if (str[int_index]>'9'||str[int_index]<'0')
		{
			return 0;
		}
		num1=num1*10+str[int_index++]-'0';
	}
	if (int_index==str.size())
	{
		return num1;
	}

	int j=str.size()-1;
	while(str[j]!='.')
	{
		if (str[j]>'9'||str[j]<'0')
		{
			return 0;
		}
		num2=num2/10+str[j--]-'0';
	}
	num2/=10;
	if (flag=='-')
	{
		return -(num1+num2);
	}
	else
		return num1+num2;
}

int main()
{
	string a[7]={"123","123.45","A123.45","-123.45","+123.45","12A.45","123.A5"};//测试用例
	double result[7];
	for (int i=0;i<7;++i)
	{
		result[i]=str_to_num(a[i]);
		cout<<a[i]<<" : "<<result[i]<<endl;
	}
	system("pause");
	return 0;
}


总结越简单的问题越要考虑全面,保证所有可能的输入,程序都能正常的处理!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值