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

模拟实现atoi

文章目录

  • 前言
  • 1.atoi函数用法
  • 2.模拟实现atoi函数
    • 2.1字符串为空
    • 2.2字符串中有'\0'
    • 2.3判断符号位
    • 2.4将字符转化为整数(考虑越界问题)
    • 2.5判断合法并传回整数
  • 3代码实现


前言

atoi函数模拟实现


1.atoi函数用法

在这里插入图片描述
C语言提供了一系列函数把字符串转换为整数:atoi、atol、atoll和atoq。
我们来看代码

#include,stdio.h>
#include<stdlib.h>//函数包含头文件
int main()
{
    char arr1[] = "-36dhy";
    char arr2[] = "  -458";
    char arr3[] = "myy123";
    char arr4[] = "";
    printf("%d\n", my_atoi(arr1));
    printf("%d\n", my_atoi(arr2));
    printf("%d\n", my_atoi(arr3));
    printf("%d\n", my_atoi(arr4));
     return 0;
}

在这里插入图片描述

2.模拟实现atoi函数

从上面的例子我们大概分几个方面来解决这个问题
1.字符串为空
2.字符串中有’\0’
3.判断符号位
4.将字符转化为整数(考虑越界问题)
5.判断合法

2.1字符串为空

直接断言就好了

#include<assert.h>
int my_atoi(char*p)
{
    assert(p);
}

2.2字符串中有’\0’

while (*p ==' ')
    {
        p++;
    }

2.3判断符号位

 int flag = 1;//设定初始为+
    if (*p == '+')
    {
        flag = 1;
        p++;
    }
    else if (*p =='-')
    {
        flag = -1;
        p++;
    }

2.4将字符转化为整数(考虑越界问题)

long long n=0;
    while (*p != '\0')
    {
        if (isdigit(*p))
        {
            n =  n* 10 + (*p - '0');
            if (n > INT_MAX)//判断越界
            {
                return INT_MAX;
                break;
            }
            if (n < INT_MIN)
            {
                return INT_MIN;
                break;
            }
        }
        else
        {
            break;
        }
        p++;
    }

我们来解析n = n* 10 + (*p - ‘0’)
在这里插入图片描述

2.5判断合法并传回整数

enum Status
{
    VALID,
    INVALID
}status = INVALID;
if (*p=='\0')
    {
        status = VALID;//这里我们用到了枚举
    }
    n = flag * n;
    return (int)n;//强制转化为整形

3代码实现

#include<stdio.h>
#include<assert.h>
#include<ctype.h>
#include <limits.h>
enum Status
{
    VALID,
    INVALID
}status = INVALID;
int my_atoi(char*p)
{
    assert(p);
    if (*p == '\0')
    {
        return 0 ;
    }
    while (*p ==' ')
    {
        p++;
    }
    int flag = 1;
    if (*p == '+')
    {
        flag = 1;
        p++;
    }
    else if (*p =='-')
    {
        flag = -1;
        p++;
    }
    long long n=0;
    while (*p != '\0')
    {
        if (isdigit(*p))
        {
            n =  n* 10 + (*p - '0');
            if (n > INT_MAX)
            {
                return INT_MAX;
                break;
            }
            if (n < INT_MIN)
            {
                return INT_MIN;
                break;
            }
        }
        else
        {
            break;
        }
        p++;
    }
    if (*p=='\0')
    {
        status = VALID;
    }
    n = flag * n;
    return (int)n;
 }
int main()
{
    char arr1[] = "-36dhy";
    char arr2[] = "  -458";
    char arr3[] = "myy123";
    char arr4[] = "";
    printf("%d\n", my_atoi(arr1));
    printf("%d\n", my_atoi(arr2));
    printf("%d\n", my_atoi(arr3));
    printf("%d\n", my_atoi(arr4));
   int n = my_atoi(arr2);
    if (status == VALID)
    {
        printf("合法转化:n=%d\n", n);
    }
    else
    {
        printf("非法转换:n=%d\n", n);
    }

    return 0;
}

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

相关文章:

  • Go 和 C# 的速度比较来了
  • 谷歌Guava LoadingCache介绍
  • 第二章:微服务架构构建
  • Python 基础阶段
  • 我发现凡是给offer的公司,面试时基本不问技术细节,那些问得又多又细的公司,后面就没下文了
  • 【微搭低代码】JavaScript基础知识-变量定义及初始化
  • Linux常见指令(下)
  • Vue组件学习、组件通信
  • 西瓜书研读——第五章 神经网络:BP神经网络
  • 有了这个库,这些爬虫都不用亲自写了!
  • Java程序设计之(一)MySQL的交互-学生信息成绩管理系统
  • MATLAB | 全网唯一! 又双叒叕一种弦图绘制
  • 【web项目】前端生日礼物--注册页面篇
  • 2022华为杯数学建模研赛选题建议和思路分析
  • c++的类与对象(上)
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • Bytom交易说明(账户管理模式)
  • C学习-枚举(九)
  • Java程序员幽默爆笑锦集
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • October CMS - 快速入门 9 Images And Galleries
  • PHP的类修饰符与访问修饰符
  • Spring Boot快速入门(一):Hello Spring Boot
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • 阿里云Kubernetes容器服务上体验Knative
  • 闭包--闭包之tab栏切换(四)
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 给初学者:JavaScript 中数组操作注意点
  • 基于axios的vue插件,让http请求更简单
  • 经典排序算法及其 Java 实现
  • 开源SQL-on-Hadoop系统一览
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 目录与文件属性:编写ls
  • 让你的分享飞起来——极光推出社会化分享组件
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 为视图添加丝滑的水波纹
  • 用jquery写贪吃蛇
  • 用Visual Studio开发以太坊智能合约
  • 阿里云ACE认证学习知识点梳理
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (补)B+树一些思想
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .Net多线程总结
  • /bin、/sbin、/usr/bin、/usr/sbin
  • /etc/shadow字段详解
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录