atoi函数源代码

2023-11-12

atoi函数源代码

isspace(int x)
{
 if(x==' '||x=='\t'||x=='\n'||x=='\f'||x=='\b'||x=='\r')
  return 1;
 else  
  return 0;
}
isdigit(int x)
{
 if(x<='9'&&x>='0')         
  return 1; 
 else 
  return 0;

}
int atoi(const char *nptr)
{
        int c;              /* current char */
        int total;         /* current total */
        int sign;           /* if '-', then negative, otherwise positive */

        /* skip whitespace */
        while ( isspace((int)(unsigned char)*nptr) )
            ++nptr;

        c = (int)(unsigned char)*nptr++;
        sign = c;           /* save sign indication */
        if (c == '-' || c == '+')
            c = (int)(unsigned char)*nptr++;    /* skip sign */

        total = 0;

        while (isdigit(c)) {
            total = 10 * total + (c - '0');     /* accumulate digit */
            c = (int)(unsigned char)*nptr++;    /* get next char */
        }

        if (sign == '-')
            return -total;
        else
            return total;   /* return result, negated if necessary */
}

 
看了atol的实现,发现char到int的转换比较奇怪:c = (int)(unsigned char)*nptr++; 先将char转为unsigned再转为int,于是测试了下,发现有如下结果:
#include<stdio.h>

void main()
{
    char c = 0x80;
    unsigned char uc = 0x80;
    printf("c2i=%x,c2ui=%x,uc2i=%x,uc2ui=%x\n", \
    (int)c,(unsigned int)c,(int)uc,(unsigned int)uc
    );
}

结果:
c2i=ffffff80,c2ui=ffffff80,uc2i=80,uc2ui=80

可以发现,如果char默认为signed(可能是平台相关的),则将char转为int或uint时,会有符号位扩展,而unsigned char则不会。atol/atoi函数应该希望避免符号位扩展而带来问题。不过,好在数字0到9的ACSII码并没有超过0x7F,因此是否事先转成unsigned char应该不会对结果有影响。


itoa()函数有3个参数:第一个参数是要转换的数字,第二个参数是目标字符串,第三个参数是转移数字时所用 的基数。

将一个整数转化为字符串 
*/  
void my_itoa(int n,char s[])  
{  
    int i,j,sign;  
  
    if((sign=n)<0)    //记录符号  
        n=-n;         //使n成为正数  
    i=0;  
    do{  
        s[i++]=n%10+'0';    //取下一个数字  
    }while((n/=10)>0);      //循环相除  
  
    if(sign<0)  
        s[i++]='-';  
    s[i]='\0';  
    for(j=i-1;j>=0;j--)        //生成的数字是逆序的,所以要逆序输出  
        printf("%c",s[j]);  
}  



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

atoi函数源代码 的相关文章

随机推荐

  • java并发的概念

    1 并发的概念 并发 concurrency 指在同一时刻只能有一条指令执行 但多个进程指令被快速的轮换执行 使得在宏观上具有多个进程同时执行的效果 但在微观上并不是同时执行的 只是把时间分成若干段 使多个进程快速交替的执行 2 并行的概念
  • Ubuntu配置中文环境

    用了一段时间的英文开发了想起来要不换中文试试 所以闲暇之余配置了一个中文 做了一个小记录 这个是英文的环境下面的界面 在安装前简称系统的网络 和源是否正常 检查网络ping www baidu com 检查源 cat etc apt sou
  • 老板的思维模式:投资与浪费

    有人说 人生最大的投资 不是房子 不是股票 是人 是跟什么人交往 跟随什么人 交什么样的朋友 其实就是你投资什么人 而这是对人生影响最大的 钱不会给你机会 股票不会 房子也不会 只有人会给你机会 当你需要帮助的时候 只有跟你要好的人会帮你
  • 企业运维实践-如何在K8S集群环境Gitlab+Jenkins+Jmeter+Grafana技术中实现自动化分布压力测试数据展示...

    关注 WeiyiGeek 公众号 设为 特别关注 每天带你玩转网络安全运维 应用开发 物联网IOT学习 本章目录 0x00 前言简述 0x01 安装配置 在 Windows 中安装 Apache jmeter 工具 以二进制方式安装Helm
  • STM32 定时器

    include timer h include led h 本程序只供学习使用 未经作者许可 不得用于其它任何用途 Mini STM32开发板 通用定时器 驱动代码 正点原子 ALIENTEK 技术论坛 www openedv com 修改
  • 关于char类型变量输入与输出的区别

    笔者前几天看到了一个小项目 请输入一个小写字母 输出对应的大写字母 乍一看挺简单 可实际操作却难倒了我 直到我打开看了老师的视频之后 我才恍然大悟 char的输入其实输入的永远是数字 没有单纯的字符 与此同时char的输出却有两种形式 c对
  • covariance matrix r语言_时间序列分析

    这是关于时间序列的第N篇文章 本文将介绍ARIMAX模型 简单来说就是在ARIMA的基础上增加一个外生变量 ARIMAX和ARIMA相比在理论上没有太多新的内容 所以本文直接介绍在R里怎么一步一步跑ARIMAX 在阅读这篇文章前 需要对AR
  • MySQL 的主从复制原理详解高级

    首先要明白为什么要用 mysql 的主从复制 1 在从服务器可以执行查询工作 即我们常说的读功能 降低主服务器压力 主库写 从库读 降压 2 在从主服务器进行备份 避免备份期间影响主服务器服务 确保数据安全 3 当主服务器出现问题时 可以切
  • eclipse中package,source folder和folder

    在eclipse的Package explorer中 如下图所示 Source folder 存放Java的源代码 eclipse会自动编译里面的文件 以 来进行文件夹的分级 默认为src文件夹 Package 一般位于source fol
  • 【深度学习】 Python 和 NumPy 系列教程(六):Python容器:4、字典Dictionary详解(初始化、访问元素、常用操作、常用函数、遍历、解析)

    目录 一 前言 二 实验环境 三 Python容器 Containers 0 容器介绍 4 字典 Dictionary 0 基本概念 1 初始化 a 使用 创建字典 b 使用dict 函数创建字典 2 访问字典元素 a 使用方括号 b 使用
  • nexus下载安装

    进入官网http www sonatype org 点击Jion Now 展开downloads 选择Nexus Repository Manager OSS 目前已经更新到3 X了 这里暂且还是选2 X的吧 下载完 解压 cmd打开命令提
  • 【软件工程】第五章 结构化设计

    5 1 结构化设计的概念 5 1 1 设计的定义 何谓设计 一种软件开发活动 定义实现需求规约所需的软件结构 目标 依据需求规约在一个抽象层上建立系统软件模型 包括软件体系结构 数据和程序结构 以及详细的处理算法 给出软件解决方案 产生设计
  • 欧拉回路【总结】【题解】

    题目 欧拉回路 UOJ 欧拉回路 Liuser s OJ 题目描述 有一天一位灵魂画师画了一张图 现在要你找出欧拉回路 即在图中找一个环使得每条边都在环上出现恰好一次 一共两个子任务 无向图 有向图 输入格式 第一行一个整数 t 表示子任务
  • vue项目启动后,js-base64依赖报错Cannot read properties of null (reading ‘replace’)

    cannot read properties of null reading replace 关于这种乱七八糟的问题 咱也不敢说 在哪也不敢问 项目运行之后 有一些警告 都是一些依赖版本的问题 平时也能直接给运行起来 这次就是项目可以运行起
  • rabbitmq+springboot实现幂等性操作

    文章目录 1 场景描述 1 1 场景1 1 2 场景2 2 原理 3 实战开发 3 1 建表 3 2 集成mybatis plus 3 3 集成RabbitMq 3 3 1 安装mq 3 3 2 springBoot集成mq 3 4 具体实
  • 阿里云服务器使用xshell连接

    阿里云服务器使用xshell连接 当购买了第一次阿里云服务器时 如何使用xshell连接 其实是非常简单的 1 登录阿里云控制台 1 是你的阿里云服务器所在地址 2 是公网IP 将来远程连接时需要使用 3 是设置远程连接的密码 用户名默认r
  • 在x86和arm编译libmodbus

    编译libmodbus 下载路径 1 编译准备 sudo apt get install libtool autogen sh 2 arm编译 autogen sh mkdir install configure ac cv func ma
  • 电压电流的驱动能力分析以及计算方法

    文章为笔者学习过程中看到的 感觉帮助较大 分享出来希望能帮助到大家 在电子电路中为什么有的地方电压会被拉低2 驱动能力是什么意思 如何提高驱动能力 在很多资料上看到说驱动能力不够是因为提供的电流太小 为什么不说电压呢 在很多限制的条件都是电
  • BIOS开启虚拟化技术

    什么是BIOS BIOS 是一个内置于个人计算机的程序 当您打开计算机时该程序启动操作系统 也称为系统固件 BIOS 是计算机硬件的一部分 不同于 Windows 怎么进入BIOS 电脑进入BIOS的方法各有不同 通常会在开机时 显示电脑l
  • atoi函数源代码

    atoi函数源代码 isspace int x if x x t x n x f x b x r return 1 else return 0 isdigit int x if x lt 9 x gt 0 return 1 else ret