首页 > 其他分享 >【C语言】atoi函数的使用及模拟实现

【C语言】atoi函数的使用及模拟实现

时间:2024-05-29 11:02:16浏览次数:22  
标签:字符 int ret C语言 atoi str 字符串 模拟

atoi (ascii to integer),是把参数 str 所指向的字符串转换为一个整数(int类型)的库函数。

使用场景

引子:

有兴趣的朋友可以听我逐句翻译一下cpluscplus.com里的这段解释(要考六级了练一下):

将字符串转换为整型

解析C-字符串str,将它的所含物解释为一个整数,将这个整数作为int类型的值返回。

这个函数首先丢弃必要数量的空白字符(像isspace),直到第一个非空白字符被找到。然后,从这个字符开始,接受一个可选的初始正号或负号,后面跟着尽可能多的十进制数字,并将它们解释为数字值。

这个字符串能够在组成整数的字符后面容纳额外的字符,这些字符会被忽略且对这个函数的行为没有影响。

如果str中非空白字符的第一个序列不是一个有效整数,或者这个序列不存在因为str要么是空字符要么只含有空白字符,那就不发生转换并将0作为返回值。

参数

以一个整数形式开始的C-字符串。

返回值

成功情况下,这个函数返回被转换的int类型的整数。

如果被转换的值超出了int能代表的最大范围,会导致未定义的行为。如果有可能的话,可以参阅strtol,以获得更健壮的跨平台替代方案。

atoi函数介绍

头文件

#include<stdlib.h>

原型 

int atoi(const char *str)

功能

把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。

返回值

返回转换后的整数,如没有执行有效的转换,返回零。

注意

转换时会先跳过前面的空格字符,直到遇上数字或正负符号才开始转换。遇到非数字或'\0',结束转换,并将结果返回。如果第一个字符不是数字,就直接返回0;

使用案例

光说难以理解,写一段代码来感受一下这个函数的使用吧:

#include<stdio.h>
#include<stdlib.h>//atoi需要的头文件
int main()
{
	char str1[] = "123star123";
	char str2[] = "star123";
	char str3[] = " -123";//注意负号
	char str4[] = "123 456";//注意中间的空白字符
	
	int r1 = atoi(str1);
	int r2 = atoi(str2);
	int r3 = atoi(str3);
	int r4 = atoi(str4);
	
	printf("%d %d %d %d\n", r1,r2,r3,r4);
	
	return 0;
}

而这是我们输出的结果: 

而还有更加特殊的情况

如果给atoi传一个空指针(NULL),会发生下面的情况:

int ret = atoi(NULL);
printf("%d", ret);

 程序直接崩溃了。

还有,字符串的数字大小超过了整型数字的取值范围

可以看到,我们明明给的是2147483648,得到的结果却是2147483647,因为这是int最大能代表的值, 这是因为当字符串的数字大小超过了int类型的取值范围时,这个函数返回时会变为int的最大或最小值。

有了上面这些例子,关于atoi函数,我们可以总结出几个特点:

1.当字符串中的数字被非10进制字符隔开时,atoi函数会返回当前位置之前的数字;

2.atoi函数会根据字符串内容自动判断整数的正负;

3.atoi函数会自动跳过开头的空白字符;

4.当参数传入NULL时会报错;传入空字符串时,返回值为0;

5.当字符串的数字大小超过了整型数字的取值范围时,返回时会变为整型数据的最大或最小值;

atoi函数模拟实现

既然我们已经知道了这个函数的实现逻辑,我们就能根据这些实现逻辑,自己写出一个模拟的atoi函数:

#include<stdio.h>
#include<ctype.h>//isspace需要的头文件
#include<stdlib.h>

int my_atoi(const char* str)
{
	if (str == NULL||'\0')//判断str为NULL或空白字符串的特殊情况
		return 0;

	while (isspace(*str))//处理开头的空白字符
	{
		str++;
	}

	int flag = 1;//flag来代表数字正负
	if (*str == '+')
	{
		flag = 1;
		str++;
	}
	else if (*str == '-')
	{
		flag = -1;
		str++;
	}
	
	long long ret = 0;//用long long类型变量来存储字符串数字,因为字符串里的数字可能大于int的最大值
	while (*str)//*str != '\0'
	{
		if (isdigit(*str))//如果这一位是10进制数
		{
			ret = ret * 10 + (*str - '0')*flag;
			str++;
			if (ret > INT_MAX)
				return INT_MAX;//如果已经超出int最大范围了,就返回int类型最大值
			if (ret < INT_MIN)
				return INT_MIN;//如果已经小于int最大范围了,就返回int类型最小值
		}
		
		else//如果这一位遇到非10进制数就直接返回当前值
		{
			return (int)ret;//别忘记强转回int
		}
	}
	return (int)ret;
}

vs运行效果参考:

那么到此,atoi函数的使用和模拟的讲解就结束了,祝阅读愉快。 

标签:字符,int,ret,C语言,atoi,str,字符串,模拟
From: https://blog.csdn.net/2301_82135086/article/details/139205057

相关文章

  • Android通过adb命令模拟发送广播
    前言通过命令行执行adbshellambroadcast发送广播通知。adbshellambroadcast后面的参数有:<INTENT>specificationsincludetheseflagsandarguments:[-a<ACTION>][-d<DATA_URI>][-t<MIME_TYPE>][-c<CATEGORY>[-c<CATEGORY>]...][-e|--......
  • 平行宇宙模拟器
    类似xkcd风格的科幻风玩意。世界A:现实设定:现在人类生活的、重力永远竖直向下指向地心的地球。生活会变成什么样?这里的生活你非常熟悉,没有变化。世界B:环界设定:重力方向环绕地球。(对地球自转不造成影响,重力方向也不随地球自转改变)生活会变成什么样?海洋河流肯定是没有了......
  • C语言结构体知识
    一:什么是结构体        结构体英文名:Structures。是一种用户定义的数据类型,它允许你将不同类型的数据组合在一起,变成一个单独的单元,这个单元里面包含了用户所创建的不同类型的变量二:关于结构体类型    如上图在这个示例中,Stu就是一个结构体类型,它包含了......
  • C语言猜数字游戏完整版
    题目:电脑随机生成1~100的随机数;玩家猜数字过程中,根据猜测数据的大小给出或多或少的反馈,直到猜对,游戏结束。首先,随机数的生成:①rand函数可以生成随机数,rand函数会返回一个伪随机数,这个随机数的范围是0~RANDMAX之间;②srand函数:用来初始化随机数的生成器;③time函数:在程序......
  • 数据结构-单向链表的实现(c语言)
    链表的定义:链表是由一系列的结点组成的,每个结点包含两个域,分别是指针域(*next)与数据域(data)。单向链表的实现//.h文件#ifndeDXLB_H#defineDXLB_H//定义结点结构体typedefstructLINKNODE{structLINKNODE*next;//指向下一个结点的指针intdata;......
  • C语言中strncpy、strncat、memcpy、memmove函数的详解与比较
    目录目录C语言中strncpy、strncat、memcpy、memmove函数的详解与比较一、strncpy函数二、strncat函数三、memcpy函数四、memmove函数C语言中strncpy、strncat、memcpy、memmove函数的详解与比较一、strncpy函数strncpy是C语言标准库中的一个函数,用于将字符串src复制到字符串d......
  • 算法题模版(C语言)
    自用总结一、最大公约数(gcd)函数法:递归法(最简):二、最小公倍数(lcm)函数法:算出最大公约数后无需递归三、斐波那契数列(fibonacci)(fib)递归法(最简):    ......
  • NOI模拟 UTF-8
    涉及知识点:数位DP前言其实这题也没啥好写的,就是好久没做大模拟调代码把人调废了,警醒一下自己……题意大模拟,不给简化题意了\(n\leq10^5\)。思路大递推DP里面套小数位DP,挺恶心的。设\(f_i\)为以第\(i\)字节结尾的方案数,每次考虑用\(4\)个字节存并且是以\(i\)......
  • C语言学习——break语句,continue语句,signed与unsigned,再论数据类型
    目录一、break语句二、continue语句 三、signed与unsigned1.当程序运行时,如果发生了越界:2.有符号与无符号 四、再论数据类型1.C语言中的sizeof关键字2.C语言中的奇葩整型(long)3.数据类型的本质区别一、break语句1、break语句可以结束当前循环的执行2、执行完brea......
  • C语言:结构体和共用体
    一.简述结构体和共用体是C语言中两种重要的用户自定义数据类型,用于将不同类型的数据组合在一起。它们在内存布局、用途和访问方式上都有显著的区别和一些相似点。以下是详细的介绍:Ⅰ结构体定义structExample{    inta;    floatb;    charc;};......