C语言中有很多的库函数,其实平时没事的时候多去实现一下里面的库函数还是很有用的,下面就来讲一讲C语言中的atoi函数,这个函数的主要功能是将一个字符串转化为一个数字,可能第一眼看上去,你会觉得这是一个很简单的函数,甚至是一个不需要多少行代码就可以实现的函数。其实这是一个看着很简单,但是实践起来还有些需要注意的地方。

如果直接给你一道题目,说让你实现一个函数,功能是将你输入的字符串转化为数字,相信这道题大家都会说简单,但是如果你真的能把所有的情况都考虑进去,那么可以说你是一个注重细节的人,因为这里需要考虑很多情况。总的来说,有以下5种情况:

1--指针为NULL
2--空字符处理
3--正号与负号的处理
4--溢出处理
5--如果遇到异常字符怎么处理

下面附上我测试的代码:

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<ctype.h>
#include<limits.h>
enum Ret                                              //状态,用来输入是否合理
{VALID,INVALID,
};
enum Ret state = INVALID;
int My_atoi(const char *str)
{int flag = 1;                                 //用来记录是正数还是负数long long ret = 0;assert(str);                                  if (str == NULL){return 0;}if (*str == '\0'){return (int)ret;}while (isspace(*str))                        //若是空字符串就继续往后{str++;}if (*str == '-'){flag = -1;}if (*str == '+' || *str == '-'){str++;}while (*str){if (*str >= '0' && *str <= '9'){ret = ret * 10 + flag * (*str - '0');                if (ret>INT_MAX||ret<INT_MIN)                 //判定是否溢出了{ret = 0;break;}}else{break;}str++;}if (*str == '\0')                  //这里while循环结束后,此时只有*str == '\0'才是合法的输入{state = VALID;}return ret;
}
int main()
{char arr[20];int ret = 0;printf("请输入您要转化的字符串:\n");scanf("%s", arr);ret = My_atoi(arr);if (VALID == state){printf("%d\n", ret);}else{printf("输入非法\n");printf("%d\n", ret);}return 0;
}

可能还有需要改进的地方,总之没有最完美的代码,只有更完美的代码。

C语言中的atoi函数的实现相关推荐

  1. C语言中itoa系列函数及sprintf系列函数使用详解

    C语言中itoa系列函数及sprintf系列函数使用详解 itoa函数系列 该系列函数是广泛使用的非标准C语言和C++语言扩展功能,只能在windows编译器下使用,如果涉及到跨平台是不允许使用的,这 ...

  2. c语言中的printf函数_C语言中的printf()函数与示例

    c语言中的printf函数 C语言中的printf()函数 (printf() function in C) The printf() function is defined in the <s ...

  3. c语言的point函数,C语言中friend友元函数详细解析

    C语言中friend友元函数详细解析 友元函数是可以直接访问类的私有成员的非成员函数.它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字frien ...

  4. C语言中的strstr函数

    C语言中的strstr函数 说到strstr函数,可能很多人会比较陌生,对比其他的字符串函数比如strcpy,strcmp等等,它的确比较少用,但其实他也是一个非常有用和常见的函数,今天,就让我们一起 ...

  5. main c语言中变量的定义,C语言中在main函数中定义的变量是全局变量么_后端开发...

    PHP 和 JavaSript 区别_后端开发 PHP是一种创建动态交互性站点的强有力的服务器端脚本语言,主要用于Web开发领域,而JavaSript是一种具有函数优先的轻量级,解释型或即时编译型的高 ...

  6. C语言中的sprint函数,求sprintf函数的详解

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:求sprintf函数的详解,要附带例,粘贴来的也可以,只 问题详情:还有就是我还想要一些常用的宽度修饰之类的输入或者输出格式:回答: ...

  7. c语言里面gets(a)是什么意思,C语言中的gets()函数

    在c语言中读取字符串有多种方法,比如scanf() 配合%s使用,但是这种方法只能获取一个单词,即遇到空格等空字符就会返回.如果要读取一行字符串, 比如:I love MIT 这种情况,scanf() ...

  8. C语言中的Sleep函数的解读

    Sleep函数: 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned seconds); 注意: 在VC中使用带上头文件#include <windows.h& ...

  9. sleep函数的作用c语言,C语言中的sleep函数是什么意思【详细介绍】

    计算机知识:C语言中的Slee函数 Sleep函数简介: 函数名: sleep 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned milliseconds); 在V ...

最新文章

  1. 记录一下matlab-vs联合编程
  2. pandas模块学习
  3. opencv学习笔记14:图像礼帽,图像黑帽
  4. How-to: Use the ShareLib in Apache Oozie
  5. 各个行业纷纷瞅准了这块大蛋糕
  6. mysql 连接池 100_mysql的最大连接数默认是100_MySQL
  7. Android Glide图片加载框架(三)缓存机制
  8. 最简单的delphi启动画面(转)
  9. 拓端tecdat|在R语言和Stan中估计截断泊松分布
  10. 实验三|Python 企业营运能力分析
  11. 阿里云 搭建flink 后 web界面可以访问 但是没有task manager节点存活
  12. 找回excel工作表保护密码
  13. 苹果手机上网速度慢_手机4G上网慢、卡吗?几种设置让你的网速飞起来
  14. 华为ME909s-821模块电信卡发短信问题
  15. 仅以此纪念我一波三十折的2022保研路--上岸华科网安直博
  16. android 模拟器 启动,android开发之启动模拟器并安装游戏apk
  17. 5 异常、断言和日志
  18. eclipse快捷键及各种设置
  19. Android Wallpaper之设置壁纸流程
  20. 两分钟彻底让你明白Android Activity生命周期

热门文章

  1. springboot老年康复中心信息管理系统的设计与实现毕业设计-附源码250859
  2. Apache--配置虚拟主机
  3. Centos8修改mysql密码
  4. Spring框架核心思想
  5. ChatGPT学习-如何向ChatGPT提问
  6. 传智播客网络营销课程大升级,改变从“薪”开始
  7. mysql主键设置了递增,插入语句的写法
  8. Android Studio统一依赖管理Composing builds
  9. dubbo优点是什么dubbo有哪些缺点
  10. 分享一下我的一些学习方法