C语言中atoi函数模拟实现详析

 更新时间:2022年10月16日 14:13:13   作者:情话0.0  
atoi函数功能是将数字字符串转换为整数,比如数字字符串"12345"被atoi转换为12345,数字字符串"-12345"被转换为-12345,下面这篇文章主要给大家介绍了关于C语言中atoi函数模拟实现的相关资料,需要的朋友可以参考下

一、atoi函数是什么?

int atoi ( const char * str );

功能:将字符串转换为整数。

解析C字符串str,将其内容解释为一个整数,该整数作为int值返回。

该函数首先丢弃尽可能多的空白字符,直到找到第一个非空白字符。然后,从这个字符开始,取一个可选的初始加号或减号,后面跟着尽可能多的数字,并将它们解释为一个数值。 例:" -123456" 转换为 -123456

字符串可以在构成整数的字符之后包含其他字符,这些字符将被忽略,并且对该函数的行为没有影响。例:" 123abc456" 转换为 123,虽然最终的输出结果是一个整数,但这属于非法转换

如果str中的第一个非空白字符序列不是有效的整数,或者由于str为空或只包含空白字符而不存在这样的序列,则不执行转换。例:“abc” " abc" “” 为非法转换,最终会输出整数0。

字符串整数合法性
" 123456"123456合法
“-123456”-123456合法
“123abc456”123非法
“abc”0非法
“”0非法
“2222222222”任意值非法

注:当转换的值超出int可表示值的范围时会发生什么,没有标准规范。

例:在VS2013编译环境下输出的数值

二、atoi函数模拟实现

#include <stdio.h>
#include <limits.h>
#include <ctype.h>

//通过枚举设置两种状态,分别代表字符串转换的合法性
enum Status
{
	VALID,  //合法
	INVALID  //非法
};

enum Status status = INVALID; //定义全局变量 status 为 INVALID,若转换合法,则将 status 变为 VALID,若非法则不变

int my_atoi(const char* str)
{
	if (str == NULL)  //字符串为空
	{
		return 0;
	}
	if (*str == '\0')  //空白字符
	{
		return 0;
	}
	while (isspace(*str))  //字符串前面有多余的空格,则一直往后移寻找符号或数字
	{
		str++;
	}
	int flag = 0;  //flag 标志数字的正负
	if (*str == '+')
	{
		flag = 1;
		str++;
	}
	else if (*str == '-')
	{
		flag = -1;
		str++;
	}
	long long ret = 0;
	while (isdigit(*str))
	{
		ret = ret * 10 + flag*(*str - '0');
		if (ret<INT_MIN || ret>INT_MAX)  //判断转换后的数字是否越界
		{
			return 0;
		}
		str++;
	}
	if (*str == '\0')  //若字符串遍历完就走这一步,也就意味着该字符串的转换为合法的
	{
		status = VALID;
		return (int)ret;
	}
	else  //非法转换
	{
		return (int)ret;
	}
}

int main()
{
	//int ret = my_atoi("-123");
	int ret = my_atoi("  -2222222222");
	if (status == VALID)
	{
		printf("合法的转换:%d\n", ret);
	}
	else
		printf("转换不合法!返回值为:%d\n",ret);
	return 0;
}

总结

基本上该函数的模拟实现要注意的细节都在上面的代码注释里。

还要再解释的是为什么要将返回值定义成 long long 长整型,而不是stoi函数的返回值 int 型呢?

这是因为在计算求和的时候万一出现越界,由于之前将返回值定义为 int 型,这时就会将已经越界的数字强制转换为非越界的数字,那么就会导致错误的输出结果和错误的合法性判断。

到此这篇关于C语言中atoi函数模拟实现的文章就介绍到这了,更多相关C语言atoi函数模拟内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • C++ 字符串去重排序实例代码

    C++ 字符串去重排序实例代码

    这篇文章主要介绍了C++ 字符串去重排序实例代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • C/C++实现对STORM运行信息查看及控制的方法

    C/C++实现对STORM运行信息查看及控制的方法

    这篇文章主要介绍了C/C++实现对STORM运行信息查看及控制的方法,需要的朋友可以参考下
    2014-07-07
  • C++中异常机制的实现机制详解

    C++中异常机制的实现机制详解

    这篇文章主要给大家介绍了关于C++中异常机制的实现机制的相关资料,文中通过图文以及示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • C语言教程之数组详解

    C语言教程之数组详解

    这篇文章主要为大家介绍了C语言教程之数组,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • 解决 VSCode 编写 C++11 代码报红问题分析

    解决 VSCode 编写 C++11 代码报红问题分析

    今天在写 C++ 代码的时候用上 C++11 的特性,然后发现 VSCode 虽然可以编译通过,但是会在相应位置报红,这是怎么回事呢?下面小编给大家带来了解决方法,一起看看吧
    2021-09-09
  • C++ HLSL实现简单的图像处理功能

    C++ HLSL实现简单的图像处理功能

    本文主要介绍了HLSL实现简单的图像处理功能的方法,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • C语言实现文件操作实例(简单图示讲解)

    C语言实现文件操作实例(简单图示讲解)

    与普通文件载体不同,文件是以硬盘为载体存储在计算机上的信息集合,文件可以是文本文档、图片、程序等等,下面这篇文章主要给大家介绍了关于C语言实现文件操作实例的相关资料,需要的朋友可以参考下
    2023-02-02
  • 一篇文章带你了解C++模板编程详解

    一篇文章带你了解C++模板编程详解

    这篇文章主要介绍了C++的模板,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • C++函数模板与重载解析超详细讲解

    C++函数模板与重载解析超详细讲解

    模板是C++最重要的设计。这篇文章讲的是函数模板,只是简单介绍模板的一些功能,关于模板的更多的内容会在类模板中详细介绍。文章还着重介绍了重载解析过程
    2022-08-08
  • C++ 的三种访问权限与三种继承方式

    C++ 的三种访问权限与三种继承方式

    我们知道C++中的类,有三种访问权限(也称作访问控制),它们分别是public、protected、private,C++中继承的方式还有多种。下面通过本文给大家详细介绍,对c++中的访问权限和继承方式感兴趣的朋友一起看看吧
    2016-11-11

最新评论