【c语言】atoi的模拟实现

简介: 【c语言】atoi的模拟实现

1.头文件

atoi() 是 C语言的一个标准库函数,定义在<stdlib.h>头文件中

2.atoi的解析

具体来讲,atoi() 函数首先会丢弃尽可能多的空白字符,直至找到第一个非空白字符,然后从该字符开始,识别 “+”、“-” 以及 0-9 之间的十进制数,最后将它们转换成整数。如果构成整数的后面还有其它字符,这些字符将会被忽略。

3.函数申明

参数

string:指向要转换的字符串。

如果由于 str 为空或者 str 字符串无法转换为整数,函数返回 0。

如果字符串表示的值超出了 int 类型所能表示的整数范围,函数返回的数值是int 最大值或最小值。

4.一些转化的例子

1.如果前面有+,转化后+号去掉


2.如果是-号,则保留


3.传入的是空指针


  1. 有空格的话跳过

5.空字符串的转化


6.大于int类型最大值,转化为int类型的最大值


7.小于int类型最小值,转化为int类型的最小值


8.出现整数后面有其他字符截断.


9.先出现其他字符比如a

5.函数实现

1.基本框架

enum State//枚举类型定义转化是否正常
{
  INVALID,//不正常
  VALID,//正常
}sta= INVALID;//先让其正常
int my_atoi(const char *str)//atoi的具体实现
{
}
int main()
{
  char arr[] = "1234";
  int ret = my_atoi(arr);//返回转化后的值
  if (sta == INVALID)//不正常转化
  {
    printf("非正常转化-%d",ret);
  }
  if (sta == VALID)//正常转化
  {printf("正常转化-%d", ret);
  }
}

2.处理空指针

int my_atoi(const char *str)//atoi的具体实现
{assert(*str);//处理空指针
}

3.处理空字符串

int my_atoi(const char *str)
{
  assert(*str);
  if (*str == '\0')//处理空字符串
  {                //处理空字符串
    return 0;    //处理空字符串
  }
}

4.处理空格

int my_atoi(const char *str)
{
  assert(*str);
  if (*str == '\0')
  {
    return 0;
  }
  while (isspace(*str))//处理空格
  {                    //处理空格
    str++;            //处理空格
  }
}

5.处理符号位

int my_atoi(const char *str)
{
  assert(*str);
  if (*str == '\0')
  {
    return 0;
  }
  while (isspace(*str))
  {
    str++;
  }
  int flag = 1;//符号位,如果为1则为正数,如果为-1则为负数,如果没加正号,默认为1;
  if (*str=='+')
  {
    flag = 1;
    str++;//跳过当前字符
  }
  else if (*str == '-')
  {
    flag = -1;
    str++;//跳过当前字符
    }
}

6.处理数字字符

int my_atoi(const char *str)
{
  assert(*str);
  if (*str == '\0')
  {
    return 0;
  }
  while (isspace(*str))
  {
    str++;
  }
  int flag = 1;
  if (*str=='+')
  {
    flag = 1;
    str++;
  }
  else if (*str == '-')
  {
    flag = -1;
    str++;
    }
long long r=0;//如果r 为int类型的话,超出范围,可能要截断,这里初始话为0,保证了空字符串返回0
  while (*str != '\0')//字符还未到末尾
  {
    if (isdigit(*str))//判断是否是字符
    {
      r = r * 10 + flag*(*str - '0');//得到字符对应的整数
      if (r > INT_MAX || r < INT_MIN)//如果超出范围
      {
        if (flag == 1)
        {
          return INT_MAX;//超出int 最大值,就返回最大值
        }
        if (flag == -1)
        {
          return INT_MIN;//超出int 最小值,就返回最小值
        }
      }
      str++;//指针移动下一个字符
    }
    else
    {
      return r;//如果str指向的不是字符的话,就返回r的值,比如1234a,此时r=1234
    }
  }
}

6.整体代码

#include<stdio.h>
#include <assert.h>
#include <ctype.h>
#include <limits.h>
#include<stdlib.h>
enum State
{
  VALID,
  INVALID
}sta= INVALID;
int my_atoi(const char* str)
{
  assert(*str);
  if (*str == '\0')
  {
    return 0;
  }
  while (isspace(*str))
  {
    str++;
  }
  int flag = 1;
  if (*str == '+')
  {
    flag = 1;
    str++;
  }
  else if (*str == '-')
  {
    flag = -1;
    str++;
    }
  long long r = 0;
  while (*str != '\0')
  {
    if (isdigit(*str))
    {
      r = r*10+(*str-'0')*flag;
      if (r > INT_MAX || r < INT_MIN)
      {
        if (flag == 1)
        {
          return INT_MAX;
        }
        else if (flag == -1)
        {
          return INT_MIN;
        }
      }
      str++;
    }
    else
    {
      return r;
    }
  }
    sta = VALID;
  return (int)r;
}
int main()
{
  char arr[] = "a111";
    int ret=my_atoi(arr);
  if (sta == VALID)
  {
    printf("正常输出%d",ret);
  }
  if (sta == INVALID)
  {
    printf("非正常输出%d",ret);
  }
}
目录
相关文章
|
4月前
|
存储 C语言
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现2
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现
|
12月前
|
C语言
【C语言】atoi函数的使用和模拟实现
本篇将介绍atoi函数的使用,通过实例讲解函数的使用方法,模拟实现atoi函数。
107 1
|
3月前
|
算法 C语言
【C语言】:atoi函数的使用及其模拟实现
【C语言】:atoi函数的使用及其模拟实现
22 5
|
4月前
|
C语言
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)(下)
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)
34 0
|
4月前
|
C语言
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)(上)
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)
103 0
|
4月前
|
存储 C语言
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现1
【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现
|
10月前
|
C语言
【C语言刷题】找单身狗、模拟实现atoi
【C语言刷题】找单身狗、模拟实现atoi
51 0
|
11月前
|
C语言
了解C语言中的atoi函数和模拟实现
了解C语言中的atoi函数和模拟实现
|
API C语言
利用strstr与atoi的结合实现一个C语言获取文件中数据的工具
利用strstr与atoi的结合实现一个C语言获取文件中数据的工具
47 0
|
C语言 C++
❤️C语言模拟实现atoi函数❤️
大家国庆节快乐!本篇博客由博主来为大家讲解关于atoi函数,不知道大家对这个函数了解吗?我根据大佬们写的atoi的模拟实现,整理出其中的相关知识。
❤️C语言模拟实现atoi函数❤️