《剑指Offer》学习笔记--面试题49:把字符串转换成整数

题目:实现一个函数StrToInt,实现把字符串转换成整数这个功能,不能使用atoi或者其他类似的库函数。

这看起来是很简单的题目,实现基本功能 ,大部分人都能用10行之内的代码解决。可是,当我们要把很多特殊情况即测试用例都考虑进去,却不是件容易的事。解决数值转换问题本身并不难,但我希望在写转换数值的代码之前,应聘者至少能把空指针,空字符串"",正负号,溢出等方方面面的测试用例都考虑到,并且在写代码的时候对这些特殊的输入都定义好合理的输出。当然,这些输出并不一定要和atoi完全保持一致,但必须要有显式的说明,和面试官沟通好。

这个应聘者最大的问题就是还没有养成在写代码之前考虑所有可能的测试用例的习惯,逻辑不够严谨,因此一开始的代码只处理了最基本的数值转换。后来我每次提醒他一处特殊的测试用例之后,他改一处代码。尽管他已经做了两次修改,但仍然有不少很明显的漏洞,特殊输入空字符串"",边界条件比如最大的正整数与最小的负整数等。由于这道题思路本身不难,因此我希望他把问题考虑得极可能周到,代码尽量写完整。下面是参考代码:

enum Status{kValid = 0, kInvalid};
int g_nStatus = kValid;

int StrToInt(const char* str)
{
	g_nStatus = kInvalid;
	long long num = 0;

	if(str != NULL && *str != '\0'){
		bool minus = false;
		if(*str == '+')
			str ++;
		else if(*str == '-'){
			str ++;
			minus = true;
		}

		if(*str != '\0')
			num = StrToIntCore(str, minus);
	}

	return (int)num;
}

long long StrToIntCore(const char *digitm bool minus)
{
	long long num = 0;

	while(*digit != '\0'){
		if(*digit >= '0' && *digit <= '9'){
			int flag = minus ? -1 : 1;
			num = num * 10 + flag * (*digit - '0');

			if((!minus && num > 0x7FFFFFFF) 
				|| (minus && num < (signed int)0x80000000)){
					num = 0;
					break;
			}
			digit ++;
		}
		else{
			num = 0;
			break;
		}
	}

	if(*digit == '\0')
		g_nState = kValid;

	return num
}

在前面的代码中,把空字符串""和只有一个正好或者负号的情况都考虑到了。同时正整数的最大值是0x7FFFFFFF,最小的负整数是0x80000000,因此我们需要分两种情况来判断整数是否发生上溢出或者下溢出。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值