经典面试题目(模拟实现atoi函数!)

近日在剑指offer一书中看到一道有趣的面试题,遂来和大家分享一波!搬来小板凳,快来看看这道面试题!

面试官:听说你精通c语言,那么你知道atoi函数么?

求职者:当然知道!

面试官:那你简单给我介绍一下这个函数吧,以及如何模拟实现该函数!(顺手递给一张白纸!)

求职者:(脸上漏出自信的微笑),atoi函数作用是将一个字符串转化为一个数字。

求职者的代码如下:

int my_atoi(char*ptr)
{
    int ret=0;
    while(*ptr)
    {
         ret=ret*10+(*ptr-'\0');
         ptr++;       
    }
    return ret;
}

面试官:嗯?这么自信,那你考虑过如果传过来的参数是空字符,空指针,非法字符,传入的数值溢出等等呢?

求职者:(心想:纳尼,糟了,竟然把这些情况漏了。)好的,我现在再修改一下!

修改后的代码如下:

enum station         // 创建枚举类型,用来分辨是否为合法状态,区分了若为空字符串返回0和正常输                    
                       // 入一个0的情况        
               
{
	VALID,
	INVALID
}s;

int my_atoi(char* ptr)
{
	s = INVALID;		//因为大多数都是非法转化情况,所以一开始将默认状态为非法的!
	//空指针的问题!
	assert(*ptr);
	//空字符串的问题!
    
	if(*ptr=='\0')
    {
        return 0;
    } 
	//正负号的问题
	int flag = 0;
	if (*ptr == '+')
	{
		flag = 1;
		ptr++;
	}
	else if (*ptr == '-')
	{
		flag = -1;
		ptr++;
	}

	//是否出现溢出问题!
	long long ret = 0;
	while (*ptr)
	{
		if (isdigit(*ptr))
		{
			ret = ret * 10 + flag * (*ptr - '0');
			ptr++;
			if (ret > INT_MAX || ret < INT_MIN)
			{
				return (int)ret;
			}
		}
		else
		{
			return (int)ret;
		}
	}
	if (*ptr == '\0')
	{
		s= VALID;
	}
	return ret;
}

从以上代码中可以看出,求职者首先使用assert函数解决了传递的空指针的问题!然后通过设置枚举类型来判断返回值的合理性,他把默认值设置为非法,因为大多数情况下为非法情况,其次呢他考虑到了传入字符串可能转化后的正负符号问题,通过设置flag来进行控制正负号

为了考虑到数值可能会非常大或非常小,他用了更大精度的long long 来定义变量,最终将其返回int类型,他也判断了是否会溢出等问题,若溢出则返回非法,若正常,则正常输出!

本代码中需要用到的函数以及其所需要包含的头文件!

isdigit       (#include)

assert       (#include)

INT_MAX     INT_MIN    (#include);

atoi           (#include)

面试官:可以,年轻人有前途!

通过本次面试实例可以让我们更加了解atoi函数,已经掌握其模拟实现!下面在cplusplus上看看有关atoi函数的相关介绍吧!

 

返回值:如果成功,则返回转化后的整形,如果转换的值超出整形可表示范围,则会造成为定义行为!

好了,今日分享到此结束,如果感觉有收获,给博主来个免费的小心心吧!你的支持会是我更新的动力哦! 

你可能感兴趣的:(面试,职场和发展,c语言)