仿写atoi函数

2019-03-11  by 崔斐然


            atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数,应用在计算机程序和办公软件中。
      int atoi(const char *nptr) 函数会扫描参数 nptr字符串,会跳过前面的空白字符(例如空格,tab缩进)等。
      如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0 [1]  。
      特别注意,该函数要求被转换的字符串是按十进制数理解的。
 

/*
      atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数,应用在计算机程序和办公软件中。
      int atoi(const char *nptr) 函数会扫描参数 nptr字符串,会跳过前面的空白字符(例如空格,tab缩进)等。
      如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0 [1]  。
      特别注意,该函数要求被转换的字符串是按十进制数理解的。
 */

/*
print相关:
①%d格式:用来输出十进制整数。有以下几种用法:%d:按整型数据的实际长度输出。
⑤%c格式:输出一个字符。
⑥%s格式:用来输出一个串。%s:例如:printf("%s", "CHINA")输出"CHINA"字符串(不包括双引号)

指针中的相关参数理解:
    printf("%c\n",s1[0]);//从指针位置向后移动0位,带[]得到的就是地基上的内容
    printf("%c\n",*s1);//打印s1的全部内容,*一般表示全部,因为定义的是char类型,
                         打印单个字符这里打印出的第一个字符是空格。
                         如果一开始定义的是int或者string 类型则会打印整个串。
    printf("%d\n",&s1[0]);//&打印内存中的真实地址,真实地址是int类型整数
*/

#include <stdio.h>

int my_atoi(const char *s1){

    int s = 0;//用于返回值
    int t = 1;//用于记录正负号,1表示正号
    int i = 0;//用于记录第几位数

    

    while(s1[i]!='\0'){ //如果循环没到最后
        if (s1[i]==' ') {  //检查这一位是不是空格,是的话就把i加1,意思是检查下一位
            i++;
        }else break; //不是的话就结束循环
    }

    
    if(s1[i]=='+'||s1[i]=='-'){ //上一步排除了空格,也就是从第i位开始没有空格了。从这里开始检测是否包含正负号
        if(s1[i] == '-') //如果这一位是-,那么t就是-1。
        {
            t=-1;
            i=i+1;  //如果有符号,位数+1
        }
    }
    
    while(s1[i]!='\0'){  // 从符号位后面继续检查,直到结尾
        if((s1[i] >= '0' )&& (s1[i] <= '9')){ //如果那一位上的内容属于0-9
            
            /* 每检测到一位就把以前检测到的w数字x10,相当于拓展了一位,再加上新读取的数字。
             这里的s1[i]-'0'指的是s1[i]位置上的ASCIIn码值和0的ASCII码相减得到的就是int 类型的差值。*/
            s = s * 10 + s1[i] - '0';
        }
        else  //直到读取的第s1[i]位置的字符不是0-9(可能是字母或者标点等)就终止
            return t*s; //返回终止前计算好的数,并乘以符号标志t,用于表示正负号。
        i++;
    }
    
    return t*s;  //如果没有标点等,返回计算好的数,并乘以符号标志t,用于表示正负号。
}

int main()
{
    char *s1 = " -1234a567";
    int num = my_atoi(s1);
    printf("%d", num);
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

崔斐然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值