天天看点

模拟实现atoi,例如输入字符串“12345”,输出整数12345

              模拟实现atoi,例如输入字符串“12345”,输出整数12345

我们需要考虑很多种情况,库里的atoi函数处理了各种情况,读者可以试着调用一下

1. ''12345".输出 12345                                    2."-12345'',输出 -12345

3."         12345",输出 12345                             4.考虑溢出的情况

5.遇到非法字符返回已计算到的值,程序结束。比如"a12345",输出0.  "12a345",输出12.   "12345a'',输出"12345"

#include<stdio.h>
#include<iostream>
#include<assert.h>
#include<ctype.h>
#include<stdlib.h>

enum STATE
{
  VALID,                       //合法
  INVALID                      //非法
};

enum STATE state = INVALID;

int my_atoi(const char *str)
{
  int flag = 1;
  long long ret = 0;
  //空指针
  assert(str != NULL);
  //空字符串的情况
  if (*str == '\0')                
  { 
    return 0;
  }
  //处理空白字符
  while (isspace(*str))
  {
    str++;
  }
  //处理+-号
  if (*str == '+')
  {
    str++;
  }
  if (*str == '-')
  {
    str++;
    flag = -flag;
  }
  while (*str)
  {
    if (isdigit(*str))
    {
      ret = ret * 10 + flag *(*str - '0');
      //考虑溢出的情况
      if ((ret > INT_MAX) || (ret<INT_MIN))                
      {
        return (int)ret;
      }
    }
    //非法字符
    else
    {
      state = VALID;
      return (int)ret;
    }
    str++;
  }
  state = VALID;
  return (int)ret;
}

int main()
{
  char *p = "-12345";
  int ret = my_atoi(p);
  if (state == VALID)
  {
    printf("%d\n", ret);
  }
  system("pause");
  return 0;
}