C语言中atoi函数模拟实现详析

  #include

  #include

  #include

  //通过枚举设置两种状态,分别代表字符串转换的合法性

  enum Status

  {

  VALID, //合法

  INVALID //非法

  };

  enum Status status = INVALID; //定义全局变量 status 为 INVALID,若转换合法,则将 status 变为 VALID,若非法则不变

  int my_atoi(const char* str)

  {

  if (str == NULL) //字符串为空

  {

  return 0;

  }

  if (*str == '0') //空白字符

  {

  return 0;

  }

  while (isspace(*str)) //字符串前面有多余的空格,则一直往后移寻找符号或数字

  {

  str++;

  }

  int flag = 0; //flag 标志数字的正负

  if (*str == '+')

  {

  flag = 1;

  str++;

  }

  else if (*str == '-')

  {

  flag = -1;

  str++;

  }

  long long ret = 0;

  while (isdigit(*str))

  {

  ret = ret * 10 + flag*(*str - '0');

  if (retINT_MAX) //判断转换后的数字是否越界

  {

  return 0;

  }

  str++;

  }

  if (*str == '0') //若字符串遍历完就走这一步,也就意味着该字符串的转换为合法的

  {

  status = VALID;

  return (int)ret;

  }

  else //非法转换

  {

  return (int)ret;

  }

  }

  int main()

  {

  //int ret = my_atoi("-123");

  int ret = my_atoi(" -2222222222");

  if (status == VALID)

  {

  printf("合法的转换:%d

  ", ret);

  }

  else

  printf("转换不合法!返回值为:%d

  ",ret);

  return 0;

  }