2024年C C++最全《剑指offer》经典面试题:模拟实现atoi()_atoi函数面试题,2024年最新阿里巴巴二面被血虐

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

int ret = atoi§;
printf(“%d\n”, ret);
return 0;
}


![](https://img-blog.csdnimg.cn/65c83338afbc4fc9a42c60b70ac90037.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p2O6YCi5rqq,size_20,color_FFFFFF,t_70,g_se,x_16)



🎵输入异常情况二:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
	const char* p = "123abc";
	int ret = atoi(p);
	printf("%d\n", ret);
	return 0;
}

输入与输出各种情况:

输入:“123”          输出:123

输入:“     123”     输出:123

输入:“abc123”    输出:0

输入:“123abc”    输出:123

输入:“+123”        输出:123

输入:“-123”         输出:-123

输入:“-abc123”   输出:0

总结:跳过前面空白,找到第一个字符,如果该字符‘+’或者‘-’则读取并跳过该字符,如果第一个非空白字符不是‘+’也不是‘-’则返回0。剩下的被认作数字字符,读到非数字字符停止。

模拟实现atoi

第一步,跳过空白字符。

    //跳过空白字符
	while (*string == ' ')
	{
		string++;
	}

第二步,读取第一个非空白字符

我们用一个int flag来判断该数字是正数还是负数。

如果第一个非空白字符是+,则我们flag==正1。

如果第一个非空白字符是-,则我们flag== 负1。

	if (*string == '+')
	{
		flag == 1;
	}
	else if (*string == '-')
	{
		flag = -1;
	}

同时我们还有几个问题没有解决。

第一个问题:“0”返回的是0,异常情况也返回0。该如何区别?

解决:该函数采取的是定义一个全局变量,来判断是正常情况,还是异常情况。

第二个问题:怎么把字符“123”转化成数字123?如何进行算数转换?

解决:

int n = 0;
while(isdigit(*string))
{
    n = n * 10 + flag * (*string - '0');
    string++;
}

第三个问题:用什么类型的整形存储转换后的数字,可能会有溢出,怎么解决?

解决:用一个long long 类型的整形存储,如果该整形超过INT_MAX或者小于INT_MIN则把它认定异常情况,最后的返回值可以返回0,也可返回(int)n,这个由程序员自己决定。

第四个问题:可能传的string是空指针。

第五个问题:传空字符串,该返回什么?

参考代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
enum State
{
	IN_VALID,//0
	VALID//1
};
enum State state = IN_VALID;
int my_atoi(const char* string)
{
	int flag = 1;
	//空指针
	if (string == NULL)
	{
		return 0;
	}
	//空字符
	if (*string == '\0')
	{
		return 0;
	}
	//跳过空白字符
	while (isspace(*string))
	{
		string++;
	}
	if (*string == '+')
	{
		flag = 1;
		string++;
	}
	else if (*string == '-')
	{
		flag = -1;
		string++;
	}
	//算数转换
	long long n = 0;
	while (isdigit(*string))
	{
		n = n * 10 + flag * (*string - '0');
		if (n > INT_MAX || n < INT_MIN)
		{
			return (int)n;
		}
		string++;
	}
	if (*string == '\0')
	{
		state = VALID;
		return (int)n;
	}
	return (int)n;
}
int main()
{
	const char* p = "   -123";
	int ret = my_atoi(p);
	if (state == VALID)
	{
		printf("合法的:%d\n", ret);
	}
	else
	{
		printf("非法的:%d\n", ret);
	}
	return 0;
}

2.2🔔itoa

itoa()函数把整数转换成字符串,并返回指向转换后的字符串的指针。

itoa是广泛使用的非标准C语言和C++语言扩展功能。但因为它是一个非标准的C / C++语言功能,因此不能好好的被所有编译器使用。在大多数Windows下的编译器通常在头文件包含非标准函数。itoa()函数把整数转换成字符串,并返回指向转换后的字符串的指针。

💲value:被转换成字符串的数字。

💲str:存储被转换后的字符串。

💲base:设置被转换后的进制,介于2-36之间,如2,8,16进制。

注意,itoa并是一个非标准的C/C++函数,它是Windows持有的,如果要写跨平台的程序,请用sprintf。

环境:vs2019 && win10

使用的是_itoa

int main()
{
	int i;
	char buffer[33];
	printf("Enter a number: ");
	scanf("%d", &i);
	_itoa(i, buffer, 10);
	printf("decimal: %s\n", buffer);
	_itoa(i, buffer, 16);
	printf("hexadecimal: %s\n", buffer);
	_itoa(i, buffer, 2);
	printf("binary: %s\n", buffer);
	return 0;
}

2.3🔔sprintf

字串格式化命令,主要功能是把格式化的数据写入某个字符串中。

函数原型:int sprintf( char *buffer, const char *format, [ argument] … );

buffer:char型指针,指向将要写入的字符串的缓冲区。

format:char型指针,指向的内存里面存放的将要格式字符串。

[argument]…:可选参数,可以是任何类型的数据。

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

[外链图片转存中…(img-BkJJBieq-1715531972033)]
[外链图片转存中…(img-uF783jzN-1715531972033)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 11
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值