【从零单排之微软面试100题系列】20之把字符串转换成整数

原题参见july大神博客系列【微软面试100题】


题目描述:输入一个表示整数的字符串,把该字符串转换成整数(int)并输出。


分析思路:(本题亦见于《剑指offer》面试题49)

核心部分的代码其实就是 num = num*10 + flag * (*str - '0');

但是本题还需要考虑到各种输入情况,比如正负号、空指针、空字符串以及溢出等方方面面。因此要尽量周到和完整

书中给出的参考代码如下:

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 == '-')
		{
			minus = true;
			str++;
		}
		if(*str != '\0')
			num = StrToIntCore(str,minus);
		
	}
	return (int) num;
}

long long StrToIntCore(const char* str, bool minus)
{
	long long num = 0;
	int flag = minus ? -1:1;	
	while(*str != '\0')
	{
		if(*str >= 0' && *str <= '9')
		{
			num = num * 10 + flag * (*str - '0');
			//判断溢出
			if( (!minus) && num > 0x7FFFFFF || (minus && num < (int) 0x80000000))
			{
				num = 0;
				break;
			}
			str++;
		}
		else
		{
		//输入含有非数字时,提前退出,并返回0,
			num = 0;
			break;	
		}
	}
	//正常遍历到字符串末位,将全局变量置为kValid,说明输出的值是有效的
	if(*str == '\0')
		g_nStatus = kValid;
	return num;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值