c语言,atoi函数的详解,以及atoi函数的模拟实现

描述

C 库函数 int atoi(const char *str) 把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。

声明

下面是 atoi() 函数的声明。

int atoi(const char *str)

参数

  • str -- 要转换为整数的字符串

返回值

该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。

实例

模拟实现atoi函数:

  1. 断言判断指针是否为空。

  1. 检查我们的的字符串如果有空格就跳过(char arr[]=" -123a5"),就会跳过空格指向 '-' 号

  1. 判断‘-’ ‘+’两个符号如果为负就将flag赋值为负一,到最后return数字时再乘上负号即可 ( return (int)(n*flag) )

  1. 检查所传的字符是否是十进制数字字符,例如:“ -123a5” “a”即为非数字字符,就会停止,返回字符之前的数字字符的总值

0-9的ASCII码值为48-57 , 所以数字字符转化为数字有两种方法:

第一种:就是ASCII码值相减,题中为‘1’-‘0’

第二种:是‘1’-48=1

-123a5

n=1

n=1*10+2

n=12*10+3

5.检查我们所输出的数据是否会产生溢出

#include<stdio.h>
#include<assert.h>
#include<ctype.h>//(isspace,isdigit)
#include<limits.h>//INT_MAX INT_MIN
enum State
{

    VALID,
    INVALID
}; state = INVALID;//初始化为INVAILD 非法的
int my_atoi(const char* arr)
{
    int flag = 1;
    assert(arr != NULL);
    if (*arr == '\0')//1.如果传过来的字符串为空,就返回0
    {
        return 0;
    }
    while (isspace(*arr))//2.isspace函数可以检查字符,如果为空白字符,
    {                     //返回非零值,否则返回0
        arr++;
    }
    if (*arr == '-')//3.判断字符串中的‘-’号
    {
        flag = -1;
        arr++;
    }
    if (*arr == '+')//4.判断字符串中的‘+’号
    {
        flag = 1;
        arr++;
    }
    long long n = 0;//为防止数过大无法用long存储,会导致后边无法检测出是否溢出,所以用long long型
    while (*arr != '\0')
    {
        if (isdigit(*arr))//5.isdigit函数检查所传的字符是否是十进制数字字符,
        {                  //如果 c 是一个数字,则该函数返回非零值,否则返回 0
            n = n * 10 + (*arr - '0');//0-9的ASCII码值为:48-57,所以转化可以用两字符相减
            if (n > INT_MAX || n < INT_MIN)//6.检查我们所输出的数据是否会产生溢出 
            {                              //大于2^32-1或者小于-2^31就会溢出
                return 0;
            }
        }
        else//如果不是数字字符,直接跳出循环,字符串不合法(里边含有非字符)
        {
            break;
        }
        arr++;
    }
    if (*arr == '\0')//当字符串中所有的字符都检测完,说明该字符串全是合法的
    {
        state = VALID;
    }
    return (int)(n*flag);
}
int main()
{
    char arr[] = "    -123a5";
    int n = my_atoi(arr);
    if (state = VALID)
    {
        printf("合法转化:n=%d\n", n);
    }
    else
    {
        printf("非法转化:n=%d\n", n);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值