首页 > 其他分享 >【C语言】模拟实现 atoi

【C语言】模拟实现 atoi

时间:2024-03-21 19:59:07浏览次数:20  
标签:字符 int C语言 INT atoi str 模拟 指针

文章目录


atoi()函数

在这里插入图片描述
在这里插入图片描述

通过上述cplusplus和MSDN对atoi函数的介绍我们可以得出以下几个关键点

  • 库函数: <stdlib.h>
  • 形参:const char * str
  • 返回值: int
  • 作用:atoi函数是将一个字符串转化成一个整型并忽视字符串中的字符

举个例子

/* atoi example */
#include <stdio.h>      /* printf, fgets */
#include <stdlib.h>     /* atoi */

int main ()
{
  int i;
  char buffer[256];
  printf ("Enter a number: ");
  fgets (buffer, 256, stdin);
  //fgets的功能是从 stream 流中读取 size 个字符存储到字符指针变量 s 所指向的内存空间。它的返回值是一个指针,指向字符串中第一个字符的地址。
  i = atoi (buffer);
  printf ("The value entered is %d. Its double is %d.\n",i,i*2);
  return 0;
}

在这里插入图片描述


模拟实现

我们先整理一下cplusplus中 atoi 函数可能会发生的一些情况

  1. 分析 C 字符串 str,将其内容解释为整数,该整数以 type int 的值返回。
  2. 该函数首先根据需要丢弃尽可能多的空格字符( isspace)直到找到第一个非空格字符。然后,从此字符开始,采用可选的初始加号或减号,后跟尽可能多的以 10 为基数的数字,并将它们解释为数值。
  3. 字符串可以在构成整数的字符之后包含其他字符,这些字符将被忽略,并且对此函数的行为没有影响。
  4. 如果 str 中的第一个非空格字符序列不是有效的整数,或者由于 str 为空或仅包含空格字符而不存在此类序列,则不执行转换并返回零。

思路分析

  • 第一步
    通过循环将纯以10为基础的数字字符串转换为数字
    因为输入的是字符,直接输出数字会转换为ASCII输出(字符1的ASCII码为49)
    所以我们可以通过输出的数字剪掉字符0来得到最终数字
int s = 0;
while(*str != '\0')
{
	s = s * 10 + *str - '0';
	str++;
}
  • 第二步
    遇到空格符号、字符或其他类型时跳过
    我们只需要用到 isdigit 函数判断是否为数字就行

  • 第三步
    开头符号问题
    我们需要先循环掉一个字符前的所有空格,在判断出现的第一个字符是否为正负号,并通过flag来记录

  • 第四步
    判断字符指针是否为野指针,或者里面没有数据
    存在这种情况时直接退出,并输出0

  • 第五步
    字符类型转整形,存在整形溢出的情况,需要定义为long long
    同时因为我们要将字符串转化成整型,既然是整型,那么必然就会有范围,在头文件limits.h中有定义,我们就可以直接调出最大值最小值,如果这个数字大于INT_MAX或者小于INT_MIN就会返回0


代码呈现

具体步骤为

  1. 是否为野指针
  2. 是否为空指针
  3. 去除开头连续空格
  4. 判断正负号
  5. 是否为数字
  6. 判断是否超出整形范围
  7. 跳过非数字类型
  8. 判断这次转换是否非法(空指针、野指针)
#define _CRT_SECURE_NO_WARNINGS  1
#pragma warning(disable:6031)
#include<stdio.h>//大哥
#include<assert.h>//断言,判断是否为野指针
#include<limits.h>//INT_MAX和INT_MIN的头文件







enum Status
{
	VALID,  //0
	INVALID //1
}status = INVALID;


int my_atoi(const char* str)
{
	assert(str);//判断是否为野指针
	
	long long s = 0;

	if (*str == "\0")//判断字符是否为空
		return 0;
	while (*str == ' ')//循环掉所有的空格
	{
		str++;
	}



	int flag = 1;//判断正负
	if (*str == '+')
	{
		flag = 1;
		str++;
	}
		
	if (*str == '-')
	{
		flag = -1;
		str++;
	}
		



	while (*str != '\0')//开始记录
	{
		if (isdigit(*str))//判断是否为数字
		{
			s = s * 10 + flag * (*str - '0');//正数累加,负数累减
			if (s > INT_MAX)
			{
				s = INT_MAX;
				break;
			}
			else if (s < INT_MIN)
			{
				s = INT_MIN;
				break;
			}
		}
		

		str++;

		
	}

	if(*str == '\0')//如果成功运行到最后一位就算完全字符转数字
		status = VALID;


	return (int)s;


}



//模拟实现atoi
int main()
{
	char a[] = "123456acd123";
	int b = my_atoi(a);
	if (status == INVALID)
		printf("非法转换:> %d", b);
	else
		printf("合法转换:> %d", b);

	return 0;
}

标签:字符,int,C语言,INT,atoi,str,模拟,指针
From: https://blog.csdn.net/2301_77954967/article/details/136910734

相关文章

  • C语言——保留整数
    题目描述:输入一个字符串str1,把其中的连续非数字的字符子串换成一个,存入字符数组str2中,所有数字字符也必须依次存入str2中,输出str2。输入:输入为一行字符串str1​,其中可能包含空格。字符串长度不超过80个字符。$Ts!47&*s456a23*+B9k输出:输出处理好的字符串str2。*47*......
  • 流域生态系统水-碳-氮耦合过程模拟
    原文链接:流域生态系统水-碳-氮耦合过程模拟https://mp.weixin.qq.com/s?__biz=MzUzNTczMDMxMg==&mid=2247598401&idx=2&sn=4c972ff3a9046094042a0a3dc65e9764&chksm=fa8200a6cdf589b01b0af612a5810e6eda02cc9e7f5232db9157ff85de28626a8f4f1878fd9f&token=1444690340&la......
  • C语言数据在内存中的存续:一篇文章让你秒懂基础!
    JAMES别扣了-CSDN博客......
  • C语言(一级指针)
    指针本质:地址一级指针一级指针变量名:存储普通变量的地址格式:存储类型        数据类型        *指针变量名                                int                *pinta=5;int*p=&a;--------......
  • C语言 - 字符串截取
    1、字符串截取#include<stdio.h>#include<stdlib.h>#include<string.h>intmain(){charstr[80]="1001#8888#你好";constchars[2]="#";char*token;char*Array[10];/*获取第一个子字符串*/token=......
  • C语言字符串
    字符串由双引号引起来的一串字符称为字符串,例如“abcdef”,字符串的结束标志是\0,在计算字符串长度时\0是结束标志,不算做字符串内容。字符与字符串的程序监控intmain(){    chararr1[]="abcdef";    chararr2[]={'a','b','c','d','e','f'};    ......
  • 2024-3-20 模拟赛总结
    tip:01串表示集合(bitset)T3buy60pts:枚举最大的bi,O(nlogn)按ai排序后选择前k-1个即可。100pts:先按bi排序用priority_queue存储前k个,从bi最小开始,扫一遍序列,每次O(logn)更新前k个。T4flight大模拟tip:写模拟时,可以分模块调试。......
  • 【C语言】求1-1/2+1/3-1/4+......-1/100
    用for循环,第二个数就为负数第三个负负为正依次推类。intmain(){ intsign=1; doublesum=0.0; intdeno=1; for(intdeno=1;deno<=100;deno++){ doubleterm=sign*(1.0/deno); sum+=term; sign=-sign; } printf("结果为:%f\n",sum)......
  • 判断是否为闰年?【C语言】
    感觉就for有些别扭。对了也可以用其他方法l#includ<stdio.h>intmain(){intyear=0;printf("请输入年份:%d\n",year);scanf("%d\n",&year);for(;(year%4==0&&year%100!=0)||year%400==0;){printf("%d:是闰年\n",year);}......
  • C语言之打鱼晒网问题
    目录一简介二代码实现步骤一:判断输入日期步骤二:计算总天数步骤三:判断行为模式三时空复杂度一简介打鱼晒网问题是一个经典的编程题目,源自中国的俗语“三天打鱼两天晒网”,意思是周期性地工作和休息。在C语言中实现这一问题的程序设计目标是:当给定一个日期后,计算......