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

目录
  • 一、atoi函数是什么?
  • 二、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函数模拟内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言模拟实现atoi函数的实例详解

    C语言模拟实现atoi函数的实例详解 atoi函数,主要功能是将一个字符串转变为整数,例如将"12345"–>12345.但在实现过程中,我们难免会因为考虑不够全面而漏掉比较重要的几点,今天就总结一下实现atoi函数需要注意的地方. 1.指针为NULL 2.字符串为空字符串 3.空白字符 4.正号与负号问题 5.溢出问题 6.异常字符处理 接下来看代码:(具体几种问题处理都在代码的注释中说明) #define _CRT_SECURE_NO_WARNINGS 1 #include

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

    目录 一.atoi函数是什么? 二.atoi函数模拟实现 总结 一.atoi函数是什么? int atoi ( const char * str ); 功能:将字符串转换为整数. 解析C字符串str,将其内容解释为一个整数,该整数作为int值返回. 该函数首先丢弃尽可能多的空白字符,直到找到第一个非空白字符.然后,从这个字符开始,取一个可选的初始加号或减号,后面跟着尽可能多的数字,并将它们解释为一个数值. 例:" -123456" 转换为 -123456 字符串可以在构成整数的字符之后

  • C语言中memcpy 函数的用法详解

    C语言中memcpy 函数的用法详解 memcpy(内存拷贝函数) c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. void* memcpy(void* destination, const void* source, size_t num); void* dest 目标内存 const void* src 源内存 size_t num 字节个数 库中实现的memcpy函数 struct { ch

  • C语言中free函数的使用详解

    free函数是我们再写C语言程序时常用的函数,但是使用时需要注意,一不小心很肯能会引起吐核. 注意:free函数与malloc()函数配对使用,释放malloc函数申请的动态内存.对于free(p)这句语句,如果p 是NULL 指针,那么free 对p 无论操作多少次都不会出问题.如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误. 看一个程序 #include <stdio.h> #include <stdlib.h> int main() { cha

  • C 语言中strstr函数实例详解

    C 语言中strstr函数实例详解 strstr函数 strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串.如果是,则该函数返回str2在str1中首次出现的地址:否则,返回NULL const char* strstr(const char* str1,const char* str2); char* strstr(char* str1,const char* str2); 库中实现的strstr #include <stdio.h> #include <

  • C语言中getch()函数详解及简单实例

    C语言中getch()函数详解及简单实例 前言: 这个函数是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车,有的C语言命令行程序会用到此函数做游戏,但是这个函数并非标准函数,要注意移植性! 所以有这样的一个接口,那就很牛逼了,至少可以做个游戏来玩下,结合ASCII码,很容易写个方向键控制的2048或者贪吃蛇等等有趣的游戏出来. 以下是以一个简单的例子: 你会发现当你按下对应的按键的时候就会打印相应的语句. #include <stdio.h> #include <fcnt

  • C语言中qsort函数的用法实例详解

    C语言中qsort函数的用法实例详解 快速排序是一种用的最多的排序算法,在C语言的标准库中也有快速排序的函数,下面说一下详细用法. qsort函数包含在<stdlib.h>中 qsort函数声明如下: void qsort(void * base,size_t nmemb,size_t size ,int(*compar)(const void *,const void *)); 参数说明: base,要排序的数组 nmemb,数组中元素的数目 size,每个数组元素占用的内存空间,可使用si

  • Java语言中flush()函数作用及使用方法详解

    最近在学习io流,发现每次都会出现flush()函数,查了一下其作用,起作用主要如下 //------–flush()的作用--------– 笼统且错误的回答: 缓冲区中的数据保存直到缓冲区满后才写出,也可以使用flush方法将缓冲区中的数据强制写出或使用close()方法关闭流,关闭流之前,缓冲输出流将缓冲区数据一次性写出.flash()和close()都使数据强制写出,所以两种结果是一样的,如果都不写的话,会发现不能成功写出 针对上述回答,给出了精准的回答 FileOutPutStream

  • 详解C语言中rand函数的使用

    前言 我们在编程实现算法的过程中,往往需要使用到随机数.由于计算机是一台以逻辑为基础的机器,没法做到真正的随机(大概量子计算机可以?).所以计算机生成的是伪随机数,供我们使用. 我们使用C语言的rand函数,生成的也是伪随机数. c语言之rand函数的使用 1.写入头文件 #include <stdlib.h> #include <stdio.h> #include <time.h> 2.变量的定义 void main( void ) { int i,k; 3.sran

  • R语言中merge函数详解

    1.创建测试数据: name <- c('A','B','A','A','C','D') school <- c('s1','s2','s1','s1','s1','s3') class <- c(10, 5, 4, 11, 1, 8) English <- c(85, 50, 90 ,90, 12, 96) w <- data.frame(name, school, class, English) w name <- c('A','B','C','F') school

随机推荐