atoi和itoa函数实现

c++实现atoi以及itoa函数 atoi函数 int atoi(char * str) 将字符串转为整形数,跳过前面的空格字符,直到遇上数字或者正负号才开始进行转换,而在遇到非数字或者字符’\0’结束转化,然后返回结果(int)。 当正溢出时返回INT_MAX,负溢出返回INT_MIN 题目思路比较简单,但是有挺多细节地方: 跳过前面的空格 使用stringstream >> string 正负号处理 将第一个有效字符单独拿出来讨论,为+,为-,为数字,为其他。 溢出处理 int的范围是[−231,231−1][-2^{31 阅读详情

atoi函数是C语言库提供的,是把字符串转换成整型数和把字符串转换成整型数。而itoa函数是广泛应用的非标准C语言扩展函数,由于它不是标准C语言函数,所以不能在所有的编译器中使用,它的功能是把一整数转换为字符串。
两个函数功能很好理解,但是它们的实现需要考虑到很多问题,在面试中,很多面试官都会问atoi和itoa的实现,这可以很好的了解程序员编程的功底。
那么在实现atoi一般需要考虑到那些情况呢?

  1. 首先是整数,很多人很自然的会忽略负整数。
  2. 其次是考虑到上溢和下溢
  3. 字符串以空格开始怎么去处理
  4. 字符串中包含了除0-9之间的字符该怎么去处理
#include <stdio.h>
 
#define MAX_INT ((1 << 31) - 1)
#define MIN_INT (-(1 << 31))
 
int atoi(const char *str){
    char *temp = str;
    int i = 0;
    int flags = 0;
    unsigned int sum = 0;
    while(*temp == ' ') ++temp ;
    if(*temp != '-' && *temp != '+' && (*temp < '0' || *temp > '9')){//第一个字符不是数字
        return 0;
    }
 
    if(*temp == '-'){ //第一个是负号
        flags = 1;
        ++temp;
    }else if(*temp == '+'){
        ++temp;
    }
 
    while(*temp >= '0' && *temp <= '9'){
        if(!flags){//上溢
            if(sum > MAX_INT / 10 || (sum == MAX_INT / 10 && (*temp > '7'))){
                return MAX_INT;
            }
 
        }else{//下溢
            if(sum > MAX_INT / 10 || (sum == MAX_INT / 10 && (*temp > '8'))){
                return MIN_INT;
            }
        }
 
        sum = sum * 10 + (*temp - '0');
        ++temp;
    }
 
    //if(flags){
        //sum *= -1;
    //}
    return flags ? (-1 * sum) : sum;
}
 
int main(){
    printf("%d\n", atoi("    0125464 c 646"));
    return 0;
}

ansi库中的实现:

#include    <ctype.h>
#include    <stdlib.h>
 
int
atoi(register const char *nptr)
{
    return strtol(nptr, (char **) NULL, 10);
}
 
/*
 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 * See the copyright notice in the ACK home directory, in the file "Copyright".
 */
/* $Header: strtol.c,v 1.4 90/05/11 15:22:19 eck Exp $ */
 
#include    <ctype.h>
#include    <errno.h>
#include    <limits.h>
#include    <stdlib.h>
 
static unsigned long
string2long(register const char *nptr, char **endptr,
            int base, int is_signed);
 
long int
strtol(register const char *nptr, char **endptr, int base)
{
    return (signed long)string2long(nptr, endptr, base, 1);
}
 
#define between(a, c, z)  ((unsigned) ((c) - (a)) <= (unsigned) ((z) - (a)))
 
static unsigned long
string2long(register const char *nptr, char ** const endptr,
            int base, int is_signed)
{
    register unsigned int v;
    register unsigned long val = 0;
    register int c;
    int ovfl = 0, sign = 1;
    const char *startnptr = nptr, *nrstart;
 
    if (endptr) *endptr = (char *)nptr;
    while (isspace(*nptr)) nptr++;
    c = *nptr;
 
    if (c == '-' || c == '+') {
        if (c == '-') sign = -1;
        nptr++;
    }
    nrstart = nptr;         /* start of the number */
 
    /* When base is 0, the syntax determines the actual base */
    if (base == 0)
        if (*nptr == '0')
            if (*++nptr == 'x' || *nptr == 'X') {
                base = 16;
                nptr++;
            }
            else    base = 8;
        else    base = 10;
    else if (base==16 && *nptr=='0' && (*++nptr =='x' || *nptr =='X'))
        nptr++;
 
    for (;;) {
        c = *nptr;
        if (between('0', c, '9')) {
            v = c - '0';
        } else
        if (between('a', c, 'z')) {
            v = c - 'a' + 0xa;
        } else
        if (between('A', c, 'Z')) {
            v = c - 'A' + 0xA;
        } else {
            break;
        }
        if (v >= base) break;
        if (val > (ULONG_MAX - v) / base) ovfl++;
        val = (val * base) + v;
        nptr++;
    }
    if (endptr) {
        if (nrstart == nptr) *endptr = (char *)startnptr;
        else *endptr = (char *)nptr;
    }
 
    if (!ovfl) {
        /* Overflow is only possible when converting a signed long. */
        if (is_signed
            && (   (sign < 0 && val > -(unsigned long)LONG_MIN)
            || (sign > 0 && val > LONG_MAX)))
            ovfl++;
    }
 
    if (ovfl) {
        errno = ERANGE;
        if (is_signed)
            if (sign < 0) return LONG_MIN;
            else return LONG_MAX;
        else return ULONG_MAX;
    }
    return (long) sign * val;
}

itoa实现注意事项:

  1. 忘记考虑负数;
  2. 忘记在末尾加上’\0′。

实现:

#include <stdlib.h>  
#include <stdio.h> 
 
char *itoa(int num,char *str,int radix){//num:int型原数,str:需转换成的string,radix,原进制, 
     
    /* 索引表 */
    char index[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    unsigned unum;/* 中间变量 */
    int i=0,j,k;
     
    /* 确定unum的值 */
    if(radix==10&&num<0){/* 十进制负数 */
        unum=(unsigned)-num;
        str[i++]='-';
    }else
        unum=(unsigned)num;/* 其他情况 */
    /* 逆序 */
    do{
        str[i++]=index[unum%(unsigned)radix];
        unum/=radix;
    }while(unum);
 
    str[i]='\0';
    /* 转换 */
    if(str[0]=='-')
        k=1;/* 十进制负数 */
    else
        k=0;
    /* 将原来的“/2”改为“/2.0”,保证当num在16~255之间,radix等于16时,也能得到正确结果 */
    for(j=k;j<(i-1)/2.0+k;j++){
        num=str[j];
        str[j]=str[i-j-1+k];
        str[i-j-1+k]=num;
    }
    return str;
}
 
int main(){
 
    int number = 01777777777777777777774; 
    char string[25]; 
 
    itoa(number, string, 10); 
 
    printf("integer = %d string = %s\n", number, string); 
    return 0; 
}

ansi库实现

#define NUMBER_OF_DIGITS 16
 
void _uitoa(unsigned int value, char* string, unsigned char radix)
{
unsigned char index, i;
/* char buffer[NUMBER_OF_DIGITS]; */ /* space for NUMBER_OF_DIGITS + '\0' */
 
  index = NUMBER_OF_DIGITS;
  i = 0;
 
  do {
    string[--index] = '0' + (value % radix);
    if ( string[index] > '9') string[index] += 'A' - '9' - 1;
    value /= radix;
  } while (value != 0);
 
  do {
    string[i++] = string[index++];
  } while ( index < NUMBER_OF_DIGITS );
 
  string[i] = 0; /* string terminator */
}
 
void _itoa(int value, char* string, unsigned char radix)
{
  if (value < 0 && radix == 10) {
    *string++ = '-';
    _uitoa(-value, string, radix);
  }
  else {
    _uitoa(value, string, radix);
  }
}



itoa和atoi函数的实现 itoa和atoi是两个常常考察的两个函数,下面是关于两个函数我的一个实现方法。一、itoa的实现方法思路: 1、使用了static作为存储方式,考虑到32位和64位机器的int数据长度的不同,字符串数组设置也应该不同,同时负数应该给予标志位‘-’符号。 2、负数%余数仍是负数,在+‘0’时会出现错误。 3、字符串由于%从低位计算,所以需要翻转字符串。 以下是具体的实现代码:#include 阅读详情

相关推荐

atoi函数和itoa函数C代码实现

一、atoi函数实现 1、atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数。 2、C代码实现如下 #include <stdio.h> #include <ctype.h> /*atoi() function:convert string to integer*/ int atoi(char str[]...

零度咖啡 421

[笔记]unsigned int 转 char 数组uitoa 函数

/* 实现itoa函数的源代码 */     char * _uitoa(unsigned int num,char *str)    {     unsigned char i=0,index=0; unsigned char temp=0; unsigned int bottom=10000; for(i=0;i { temp=num/bottom; if(temp>0 ||

aijie099的专栏 2145

小土堆学习笔记1:Dataset类代码实践

上一页中反复提到“类”,这究竟是什么东西?按我的理解(肯定不准确也不正式),class类就是某一个东西的共性,而且是等待被确认的共性。比如每台手机都有它自己的品牌、框架、价格等等属性,class类正是这些尚不确定的属性;而一旦确认了这些属性,就能够确认这到底是一台什么型号什么状态的手机,在确认了全部属性后就知道,这是一台Apple 16 Pro Max。抽象的不确定的共性就是类,具体的确定的个性就是示例。这个共性可以被用于多个编程目的,只不过某一个具体的编程行为还有它自己的独特性。

qq_40525602的博客 1626

STM8 普通IO配置模拟串口输出

刚接到上级的需求,由于stm8的串口资源较少,需要在原来工程的基础上加多一个io来输出串口数据。串口在每个学习单片机的人来说都是耳熟能详的东西。没有串口基础的同学建议先去学习串口知识点再来阅读。 首先我们知道串口数据配置里面包含:波特率、流控、数据起始位、数据位、奇偶校验位、停止位。针对本人经常选的配置为: 波特率 115200 bps 流控 无 数据位 8 ...

fangjiaze444的博客 1861

QCC308X/518X/309X加LDAC解码

QCC308X/518X/309X加LDAC解码。

Alex_886的博客 6606

【论文+CAD图纸】光储充一体化微电网设计

近些年来,我国的经济发展迅速,对能源的需求不断增长,也加重了对环境的破坏,违背了我国的可持续发展战略。所以迫切需要寻找新型能源。由于太阳能在使用时不会产生污染,所以太阳能逐渐受到人们的重视。我国的太阳能资源丰富,具有的开发利用潜力。特别是近些年“光储充”一体化充电站为高科技绿色充电模式,“以光养桩”使光伏、储能、智能充电协同,智能微电网与公共电网互动,本设计对探索清洁可再生能源在民用场合的应用,有着重大的理论和工程价值。本文综述国内外相关光伏发电的成果和发展现状;

weixin_761237174的博客 925

atoi(c89)

<!-- .mjn * {font-family:Courier New; padding:0px; margin:0px} .mjn h1 {font-size:1.2em; font-weight:bold; border-bottom:1px solid green; margin:10px 0px} .mjn h2 {font-size:1em;

MJN 8353

告别MATLAB环境!保姆级教程:用Application Compiler把你的GUI程序打包成独立exe(2020R版本实测)

本文详细介绍了如何使用MATLAB的Application Compiler工具将GUI程序打包成独立exe文件,特别针对2020R版本进行实测。从技术原理、配置详解到打包实战与问题排查,提供完整的解决方案,帮助开发者实现无需MATLAB环境的程序分发,提升工作效率。

weixin_30571465的博客 274

字符和数字的转换函数

C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮点型等)的数字转换为字符串。 以下是用itoa()函数将整数转换为字符串的一个例子: #include #include void main(void) { int num = 100; char str[25]; itoa(num, str, 10); printf("The number 'num' is %d and the s

u013455430的专栏 765

2025年华为杯中国研究生数学建模竞赛A题 通用神经网络处理器下的核内调度问题 思路+代码

针对通用神经网络处理器下的核内调度问题,我们提出了一套基于分层优化框架的系统性解决方案。该方案首先通过缓存敏感的启发式拓扑排序算法生成最小峰值缓存占用的调度序列,在满足计算图依赖关系的前提下优先选择能够释放或减少缓存占用的节点;随后采用最佳适应算法进行精细化的缓存分配,结合LRU换出策略动态管理多级缓存空间,最小化额外数据搬运量;最后引入多目标遗传算法进行联合优化,在严格控制数据搬运量不显著增加的前提下,通过关键路径分析、流水线并行和数据预取等技术进一步优化总执行时间。

YOLO 785

开源鸿蒙具身机器人(ROS2框架):从内核驱动到智能算法的完整实践

本指导文档旨在为开发者提供完整的开源鸿蒙(OpenHarmony)具身机器人开发解决方案,涵盖从底层驱动到上层ROS2应用的全栈开发流程。文档结合OpenHarmony内核驱动移植技术和ROS2机器人操作系统,为具身机器人开发提供详细的技术指导。具身机器人(Embodied Robot)是指具有物理实体、能够感知环境并与之交互的智能机器人系统。感知-决策-执行闭环多模态传感器融合(视觉、听觉、触觉、力觉)实时环境感知与理解智能决策与规划精确运动控制执行具身智能特性物理世界交互能力。

m0_67505153的博客 1268

Linux下 itoa,atoi 函数的实现

atoi和itoa是C中两个常见的函数,功能是进行字符和数字来回转换,原型如下: int atoi(const char *nptr); //nptr是要转换的字符串,返回转换后的整数。 char *itoa( int value, char *string, int radix); //value是要转换的整数,string是接受的转换后字符串,返回的也是这个, radix是几进制,如2,10分别表示二进制,10进制。 itoa函数的头文件是stdio.h, 它并不是一个标准的C函数...

Briwisdom的博客 1万+

YOLOv8改进,YOLOv8添加可变性卷积DCNv2

DCNv2对原始的DCNv1进行了改进,可变形卷积网络的卓越性能源于其适应对象几何变化的能力。通过对其自适应行为的检查,虽然对其神经特征的空间支持比常规的ConvNets更接近于对象结构,但这种支持可能远远超出感兴趣区域,导致特征受到不相关图像内容的影响。为了解决这个问题,我们提出了一种可变形卷积网的重新表述,通过提高建模能力和更强的训练,提高了其专注于相关图像区域的能力。通过更全面地集成网络中的可变形卷积,并引入扩展变形建模范围的调制机制,增强了建模能力。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 3606

atoi,itoa函数实现

1.atoi函数实现int atoint(const char * string){    int n = 0; int i;    for(i = 0; string[i] >= 0 && string[i]     {   n = 10*n + string[i] - 0; continue;}    return n;} int main(){ char *p; char b

zjbruce2000的专栏 1964

【人工智能】向量数据库全生命周期数据安全防护体系:破解向量化与检索双环节泄露风险

大模型时代,向量数据库已成为RAG(检索增强生成)架构、语义检索、多模态应用的核心基础设施,解决了大模型幻觉、长上下文窗口限制、私有知识落地等核心痛点。但行业普遍存在认知误区:将Embedding向量等同于“无害的语义压缩乱码”,忽视了向量数据原生的泄露风险。

奶爸的编程之路,也就一周冷个三天 157

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

函数 atoi() 和 itoa() 的 C 语言实现。

函数 atoi() 和 itao() 的 C 语言实现。 1. atoi() 函数    #include #include #include int myatoi(const char *str){ int c; int total; int sign; while(isspace((int)(unsigned char)*str)){ +

程序人生 3315

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

实现函数atoi和itoa

//atoi的实现 #include using namespace std; int atio1(char *s) { int sign=1,num=0; if(*s=='-') sign=-1; s++; while((*s)!='\0') { num=num*10+(*s-'0'); s++; }

晴天的专栏 1391

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

atoi和itoa函数的实现

1 itoa的实现 //1234→4321(存储:str=n%radix,n=n/radix)→ 1234 //todo: 把含有 负数的内容写上去就好了 char * my_itoa2( int num, char *string, int radix ) {  char* str=string;  //得到翻转的字符串  while(num)  {   *str=num%r

xinrenok的专栏 893

【造轮子】实现 atoi、itoa 函数

1. atoi 函数 1.1 函数简介 atoi 函数为 C 库函数之一,用于把字符串转换为对应的整形十进制数字。 原型:int atoi (const char* str); 所属头文件:<stdlib.h> 功能:把 str 指向的字符串转换为对应的整形十进制数字。 返回:转换得到的数值。 1.2 函数说明 在原 atoi 函数中,如果字符串含非数字字符即非 ‘0’ -...

Kong 351

自己编写代码实现atoi和itoa函数的功能

 自己编写代码实现atoi和itoa函数的功能 1. atoi(ascii to integer)函数:把字符串转换成整形数的一个函数,检测到非数字字符时停止转换。 atoi函数的实现代码: #include #include #define MAX_SIZE 1024 int my_atoi(char *ptr) {     int i,k = 0;

Eleanor_12的博客 1053

模拟实现C库里的itoa()函数和atoi()函数

一、函数原型 int atoi(const char *nptr);将字符串转换为整型值 char* itoa(int value,char* str,int base);将整形转为字符串。这个函数有3个参数,第一个参数是要转换的数字,第二个参数是要写入转换结果的目标字符串,第三个参数是转换数字时所用的技基数,比如10代表十进制,2代表二进制。 两个函数都在C语言里的库函数里。 二、模拟实

qq_36534818的博客 667

【练习题】atoi和itoa函数的实现

int atoi (const char * str); //Convert string to integer char * itoa ( int value, char * str, int base ); //Convert integer to string (non-standard function) #include #include int my_atoi(con

我不会编程,但不是完全不会,我会一点点 1079

模拟实现atoi和itoa函数

模拟实现atoi 思路: atoi函数,实现字符串到数字的转换,例如,将“1111”转成数字就是1111,在转的时候我们可以定义一个指针,随着指针的后移,把字符串的每一个字符,依次转成数字,另外还需注意,负号和空格问题,在代码中都应该考虑到。 代码: //模拟实现atoi long my_atoi(char*p) { int flag = 1; long number = 0;

yaszja的博客 642

C函数atoi,itoa的实现代码

 我自己写的C函数atoi,itoa的一个实现,代码如下: //返回值 -1表示出错//参数num引用返回转换后的整数int atoi(int& num,const char * s)...{ if( s == NULL)  return -1; const char * p = s; while (*p ==  ) ...{  ++p; } int bits = 0; bool 

iSeeSong 作者的专栏 2140
上一篇: Sizeof与Strlen的区别与联系
下一篇: c++循环读取多行文本文件
outer_star
博客等级 码龄14年 8粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值