当前位置: 首页 > article >正文

c语言 atoi 函数的功能和模拟实现

1.atoi函数的功能

atoi函数功能是将数字字符串转换为整数;字符串"123456"被此函数转换成123456 atoi函数调用所用的头文件 #include<stdlib.h>

atoi函数的使用例子

代码如下

#include<stdio.h>
#include<stdlib.h>
int main()
{
	char arr[100] = "123456";
	int ret = atoi(arr);
	printf("%d\n", ret);
	return 0;
}

2.模拟实现atoi

初步模拟实现atoi

可以把数字字符串转换成整数,首先不考虑正负号问题  都为正

此方法适用于任何一个整数

代码如下   分析如下

int my_atoi(const char* str)
{
	int n = 0;
	while (*str!='\0')
	{
		n = n * 10 + (*str - '0');//把字符串转换成整数
		str++;
	}
	return n;
}
int main()
{
	char arr[100] = "12345";
		int ret = my_atoi(arr);
		printf("%d\n", ret);
		return 0;
}

atoi函数具体实现考虑6种情况

1.空指针

2.空字符串

3. 空字符的空格

4. 非数字的字符

5. 溢出问题

6. 正负号问题   

如何解决存在的6种情况:

1.空指针问题使用assert函数断言:

2.空字符串第一个元素是‘\0’,判断是否返回‘\0’,注意返回的是字符还是空字符串,存在非法转换和合法转换,利用,枚举解决,创建一个枚举类型初始化为非法,由于非法情况多,合法只有一种。其实将空字符转换为整数0是一种非法转换

3.当遇到空字符串有空格,可以直接跳过所在的内容,指针++指向下一个内容。

4非数字的字符:"145ary23",直接返回145无需继续放下走,也是非法转换

5.溢出问题是数字字符,当所得的N的值大于最大整型或小于最小整型,返回最大整型或最小整型,此问题也是非法转换

6.正负号问题 用变量flag记录,初始化为1,正数时为1,字符串中有‘-’时为-1,记录符号位。

函数使用来判断是否为空格,该函数参数若为空格则返回非0,参数若为非空格则返回0;所以我们用一个while循环并使用该函数就能轻松解决第三个问题;使用isspace函数需要包含

#include <ctype.h>

该函数用来判断是否是数字字符,若是数字字符'0'到'9'返回非0,若不是数字字符返回0;使用isdigit函数需要包含#include <ctype.h>

当是数字字符时,将其减去'0'即转换为数字,再继续判断下个字符,若是非数字字符则直接返回 

代码如下

#include<stdio.h>
#include<ctype.h>
#include<limits.h>
#include<assert.h>
enum Status
{
	VALID,
	INVALID
}status = INVALID;//初始化为非法
int my_atoi(char* str)
{
	int flag = 1;//记录符号位
	//空指针
	assert(str);
	//空字符串问题
	if (*str == '\0')
	{
		return 0;
	}
	//空字符问题
	while (*str == ' ')
	{
		str++;
	}
	//正负号问题
	if (*str == '+') 
	{
		flag = 1;
		str++;
	}
	if (*str == '-')

	{
		flag = -1;
		str++;
	}
	long long n = 0;
	while (*str != '\0')
	{
		//不是数字字符问题
		if (isdigit(*str))
		{
			n = n * 10 + (*str + '0');
			//溢出问题
			if (n > INT_MAX)
			{
				return INT_MAX;
				break;
			}
			if (n < INT_MIN)
			{
				return INT_MIN;
				break;
			}
		}
		else
		{
			//不是数字字符直接跳出循环,status此时时无效的INVALID
			break;
		}
		str++;
	}
	if (*str == '\0')
	{
		status = VALID;
	}
	n *= flag;
	return (int)n;//强制类型转换int类型
}
int main()
{
	int n = 0;
	char* str = "-1234er56";
	n = my_atoi(str);
	//判断合法非法
	if (status == VALID)
	{
		printf("合法转换:n=%d\n", n);
	}
	else
	{
		printf("非法转换:n=%d\n", n);
	}
	return 0;
}

 谢谢观看  


http://www.kler.cn/news/361031.html

相关文章:

  • YOLO11改进 | 注意力机制 | 正确的 Self-Attention 与 CNN 融合范式,性能速度全面提升【独家创新】
  • 【LVGL快速入门(二)】LVGL开源框架入门教程之框架使用(UI界面设计)
  • 揭秘 Feign 调用机制:微服务通信的无缝集成
  • 信创服务器下搭建nfs共享存储方案
  • spring源码拓展点3之addBeanPostProcesser
  • MIT6.S081 LAB page tables (2024)
  • C++ 游戏开发:从基础到进阶
  • 2025秋招八股文--网络原理篇
  • React 基础阶段学习计划
  • 点云数据介绍
  • [论文笔记]RA-DIT: RETRIEVAL-AUGMENTED DUAL INSTRUCTION TUNING
  • Golang | Leetcode Golang题解之第497题非重叠矩形中的随机点
  • Python程序设计 内置函数 日志模块
  • eIQ笔记(UI介绍+Loss曲线+OpenART例程)
  • linux更改系统时间
  • 基于基于MATLAB红外和可见光图像融合算法研究
  • 【分布式微服务云原生】《微服务架构下的服务治理探秘》
  • 从外行人的角度解释1Bit的模型,是怎样改变世界的
  • Qt编写的modbus模拟器/支持网络和串口以及websocket/支持网络rtu
  • Standard_Matrix