第十二弹--模拟使用atoi函数

简介: 第十二弹--模拟使用atoi函数

模拟一个比较少见的转化函数atoi

定义 int atoi (const char * str);

功能 数字字符转化为数字

转化种类如下图

1、遇到0或空格默认忽略

2、有符号不舍去

3、+自动忽略

4、末尾有非数字字符忽略

第一步创建循环输入字符串

int main()
{
  char arr[255] = { 0 };
  while (scanf("%s", arr)!=EOF)
  {
    int ret=my_atoi(arr);
    printf("%d\n",ret);
  }
  return 0;
}

第二步开始创建函数,并解决第一个数组为空情况问题

int my_atoi(const char* str)
{
  assert(str);//断言
  int flag = 1;//创建falg解决正负号问题
  int ret = 0;
  //首先判断不为空
  if (*str == '\0')
  {
    return 0;
  }
}

第三步 解决’0’和’ '问题

//如果是'0'或者' '忽略,可能出现多个空格或者'0'使用循环
while (*str == '0' || *str == ' ')
{
  str++;
}

第四步 解决正负号问题

  //正负号情况
  if (*str == '-')
  {
    flag = -1;//把flag变成-1就可以在转化的时候保留-号
    str++;
  }
  else if(*str=='+')
  {
    flag = 1;
    str++;
  }

第五步 转化

while (*str != '\0')//需要多次转化 使用循环
{
  if (*str >='1' && *str <= '9' )//判断是否是在1-9内的数字字符
  {
     ret = ret * 10 + flag * (*str - '0');
     if (ret<INT_MIN || ret>INT_MAX)//过大或过小返回0
     {
       return 0;
     }
  }
  else
  {
    break;
  }
  *str++;
  return (int)ret;
}

总代码

int my_atoi(const char* str)
{
  assert(str);
  int flag = 1;
  int ret = 0;
  //首先判断不为空
  if (*str == '\0')
  {
    return 0;
  }
  //如果是'0'或者' '忽略,可能出现多个空格或者'0'使用循环
  while (*str == '0' || *str == ' ')
  {
    str++;
  }
  //正负号情况
  if (*str == '-')
  {
    flag = -1;
    str++;
  }
  else if(*str=='+')
  {
    flag = 1;
    str++;
  }
  //转换
  while (*str != '\0')
  {
    if (*str >='1' && *str <= '9' )
    {
       ret = ret * 10 + flag * (*str - '0');
       if (ret<INT_MIN || ret>INT_MAX)
       {
         return 0;
       }
    }
    else
    {
      break;
    }
    *str++;
  }
  return (int)ret;
}
int main()
{
  char arr[255] = { 0 };
  while (scanf("%s", arr)!=EOF)
  {
    int ret=my_atoi(arr);
    printf("%d\n",ret);
  }
  return 0;
}


相关文章
|
3月前
|
C语言
C语言第四十八弹---多种方法模拟实现strlen函数
C语言第四十八弹---多种方法模拟实现strlen函数
|
3月前
|
C语言
C语言第四十九弹----模拟使用strcpy函数
C语言第四十九弹----模拟使用strcpy函数
|
3月前
|
C语言
C语言第三十八弹--模拟实现strcmp
C语言第三十八弹--模拟实现strcmp
|
3月前
|
C语言
C语言第五十四弹---模拟使用strstr函数
C语言第五十四弹---模拟使用strstr函数
|
3月前
|
C语言
C语言第五十一弹--模拟使用strncpy函数
C语言第五十一弹--模拟使用strncpy函数
|
3月前
|
C语言
C语言第四十一弹--模拟实现strlen
C语言第四十一弹--模拟实现strlen
|
3月前
|
C语言
C语言第五十七弹---模拟使用memmove函数
C语言第五十七弹---模拟使用memmove函数
|
3月前
|
C语言
C语言第五十六弹---模拟使用memcpy函数
C语言第五十六弹---模拟使用memcpy函数
|
3月前
|
C语言
C语言第五十二弹--模拟使用strncat
C语言第五十二弹--模拟使用strncat