C语言模拟实现atoi函数的实例详解

 更新时间:2017年08月11日 14:18:13   作者:卡哇伊的柠檬  
这篇文章主要介绍了C语言模拟实现atoi函数的实例详解的相关资料,atoi函数,主要功能是将一个字符串转变为整数,这里就实现这样的函数,需要的朋友可以参考下

C语言模拟实现atoi函数的实例详解

atoi函数,主要功能是将一个字符串转变为整数,例如将“12345”–>12345。但在实现过程中,我们难免会因为考虑不够全面而漏掉比较重要的几点,今天就总结一下实现atoi函数需要注意的地方。

1.指针为NULL
2.字符串为空字符串
3.空白字符
4.正号与负号问题
5.溢出问题
6.异常字符处理

接下来看代码:(具体几种问题处理都在代码的注释中说明)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <assert.h>

//定义两个枚举常量来表示状态
enum STATE
{
  VALID, //合法
  INVALID,//非法
};
enum STATE state = INVALID;
int my_atoi(const char *str)
{
  int flag = 1;
  long long ret = 0;//定义为比int存储范围还要大的类型,防止后面判断溢出时出错。
  //空指针
  assert(str);
  //空字符串
  if (*str == "\0")
  {
    return 0;
  }
  //空白字符
  while (isspace(*str))//用函数isspace判断是否为空白字符
  {
    str++;
  }
  //遇到正负号
  if (*str == '-')
  {
    flag = -1;
    str++;
  }
  if (*str == '+')
  {
    str++;
  }
  //
  while (*str)
  {
    //if (*str >= '0'&&*str <= '9')
    if (isdigit(*str))//用函数isdigit判断是否为数字字符
    {
      ret = ret * 10 + flag*(*str - '0');
      //判断是否溢出
      if (ret > INT_MAX || ret < INT_MIN)
      {
        return ret;
      }
    }
    //异常字符
    else
    {
      break;
    }
    str++;
  }
  state = VALID;
  return ret;
}
int main()
{
  char *p = "12345";
  char *q = " -12345";
  int ret = my_atoi(p);
  int ret2 = my_atoi(q);
  printf("%d\n", ret);
  printf("%d\n", ret2);
  system("pause");
  return 0;
}

运行结果:

以上就是C语言模拟实现atoi函数的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

您可能感兴趣的文章:

相关文章

  • C++使用map实现多进程拷贝文件的程序思路

    C++使用map实现多进程拷贝文件的程序思路

    这篇文章主要介绍了C++使用mmap实现多进程拷贝文件,通过本文给大家分享程序思路及完整代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • C++如何比较两个字符串或string是否相等strcmp()和compare()

    C++如何比较两个字符串或string是否相等strcmp()和compare()

    这篇文章主要介绍了C++如何比较两个字符串或string是否相等strcmp()和compare()问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • C语言数学问题与简单DP01背包问题详解

    C语言数学问题与简单DP01背包问题详解

    这篇文章主要介绍了C语言数学问题买不到的数目、蚂蚁感冒、饮料换购与简单DP01背包问题的解决,属于蓝桥杯省赛中的题目,感兴趣的同学来看看吧
    2022-04-04
  • C++报错:Segmentation Fault的解决方案

    C++报错:Segmentation Fault的解决方案

    段错误(Segmentation Fault)是 C++ 编程中常见且令人头疼的错误之一,段错误通常发生在程序试图访问未被允许的内存区域时,导致程序崩溃,本文将深入探讨段错误的产生原因、检测方法及其预防和解决方案,需要的朋友可以参考下
    2024-07-07
  • C++ 模拟实现list(迭代器)实现代码

    C++ 模拟实现list(迭代器)实现代码

    这篇文章主要介绍了C++ 模拟实现list(迭代器)实现代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • C++面试基础之static关键字详解

    C++面试基础之static关键字详解

    这篇文章主要给大家介绍了关于C++面试基础之static关键字的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • C++实现LeetCode(59.螺旋矩阵之二)

    C++实现LeetCode(59.螺旋矩阵之二)

    这篇文章主要介绍了C++实现LeetCode(59.螺旋矩阵之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言signed关键字的详细使用

    C语言signed关键字的详细使用

    这篇文章主要介绍了C语言signed关键字的详细使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    的相关资料
    2017-06-06
  • 解决不用sizeof求出int大小的方法

    解决不用sizeof求出int大小的方法

    本篇文章是对不用sizeof求出int大小的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++中的多态与多重继承实现与Java的区别

    C++中的多态与多重继承实现与Java的区别

    这篇文章主要介绍了C++中的多态与多重继承实现与Java的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03

最新评论