看到很多面试书和博客都提到编写atoi函数,在很多面试中面试官都会要求应聘者当场写出atoi函数的实现代码,但基本很少人能写的完全正确,倒不是这道题有多么高深的算法,有多么复杂的数据结构,只因为这道题要考虑的情况比较多,大部分应聘者都没能把所有情况都考虑到,能很好的考察应聘者的编程基本功和思考问题全面性等能力。一看到这道题目我的第一反应是这么简单啊,不就是把一个字符串转化成整数吗?然后速度写下了实现代码,然后测试了下,貌似结果也正确,然后再看了看书和博客上的实现,发现自己很多种情况都没考虑进去,自己测试的也只是自己考虑的一两种情况。

  这道题目要考虑的情况还真是很多,比如:如果传的字符串指针为NULL;如果传的字符串为空;如果传的字符串中包含非法的字符;如果传的字符串中包含+-符号;如果字符串代表的整数超过了整数能表示的范围...,看了这么多情况,真心感觉实现这个函数还真不是件简单的事,下面贴出我自己重新写的atoi函数。

 int myError = ;

 int atoi(const char *str)
{
bool is_f = false;
long long result = ; myError = ;
if (str == NULL || *str == )
{
myError = -;
return ;
}
if (*str == '+' || *str == '-')
{
if (*str == '-')
is_f = true;
++str;
if (*str == )
{
myError = -;
return ;
}
}
while (*str)
{
if (!(*str >= '' && *str <= '') ||
(!is_f && result > 0x7fffffff)
|| (is_f && result > 0x80000000))
{
myError = -;
return ;
}
result = result * + (*str - '');
++str;
}
if((!is_f && result > 0x7fffffff)
|| (is_f && result > 0x80000000))
{
myError = -;
return ;
}
return is_f ? -((int)result) : (int)result;
}

  上面代码我将出错的代码保存在myError全局变量中,因为如果用返回值来表示出错,这个会与字符串代表的整数值产生混淆。上面的代码自己测试了下貌似对应上面写得各种情况都正确,不过写得代码质量不高,贴出来仅供分享,也许还有没有考虑的情况。

编写atoi库函数的更多相关文章

  1. 自己用c语言实现字符串处理库函数以及扩展

    1.实现基本的c语言库函数: int myStrlen( const char* str);//根据传入的字符串首地址获取字符串长度:返回值为长度 int myStrlen(const char* s ...

  2. 《C专家编程》第二章——这不是Bug,而是语言特性

    无论一门语言有多么流行或多么优秀,它总是存在一些问题,C语言也不例外.本章讨论的重点是C语言本身存在的问题,作者煞费苦心的用一个太空任务和软件的故事开头,也用另一个太空任务和软件的故事结尾,引人入胜. ...

  3. linux静态库的生成与使用(转)

    linux静态库的生成与使用(转) 库是一种软件组件技术,库里面封装了数据和函数. 库的使用可以使程序模块化. Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件). Linu ...

  4. makefile生成静态库和动态库

    库是一种软件组件技术,库里面封装了数据和函数. 库的使用可以使程序模块化. Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件). Linux通常把库文件存放在/usr/lib ...

  5. objective-c 中的关联介绍

    objective-c 中的关联介绍 转载请注明CSDN博客上的出处: http://blog.csdn.net/daiyibo123/article/details/46471993 如何设置关联 ...

  6. C语言的本质(34)——静态库

    库是一种软件组件技术,库里面封装了数据和函数. 库的使用可以使程序模块化. Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件). Linux通常把库文件存放在/usr/lib ...

  7. 嵌入式单片机STM32应用技术(课本)

    目录SAIU R20 1 6 第1页第1 章. 初识STM32..................................................................... ...

  8. linux动态库

    1.编写动态库函数接口 gcc -fPIC -shared -o libfunction.so funtion.c 2.写头文件 3.测试 gcc test.c -L. -lfuntion -o ru ...

  9. C++之语言概述

    C++语言是广泛使用的程序设计语言之一,因其特有的优势在计算机应用领域占有重要一席. C语言的发展 20世纪70年代初,贝尔实验室的Dennis Richie 等人在B语言基础上开发出C语言,最初是作 ...

随机推荐

  1. grep 信息提取

    1.提取svn版本库的版本号 svn info |grep -Po '(?<=Revision: )[0-9]*'

  2. 在linux下Ant的环境配置

    Ant(英文全称为another neat tool,另一个简洁的工具)是一个基于Java的生成工具,Ant将会被应用到Java项目中. 同样的,现在要来安装Ant(最近要安装的东西还蛮多的=m=), ...

  3. 自定义 TableViewCell 的分割线

    刚开始自定义 tableViewCell 的时候,用的是直接在 cell 上加一张 imageView 的方法,如果在点击 cell 的时候有页面的跳转,这样做没什么问题,但是,如果在点击 cell ...

  4. SSH整合,必出精品

    SSH:顾名思义(spring,struts2,hirbernate)  Struts(表示层)+Spring(业务层)+Hibernate(持久层) Struts是一个表示层框架,主要作用是界面展示 ...

  5. HDU--最小路

    最小路 Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  6. Allegro之Win7下不能实时刷新操作显示的问题

    Allegro软件主界面下: setup-> user preferences-> display->opengl中选定disable_opengl,即关掉OpenGL后,再重新启动 ...

  7. 【转】WriteMessage的信息在AutoCAD中命令行中实时显示

    之前程序中有段发送信息到命令行上显示的代码,如下:     ed.WriteMessage("开始标注横断面高程,请稍候!");     但是发现命令行中并不马上显示,代码也明明运 ...

  8. 安装SQL Server2016正式版

    安装SQL Server2016正式版 今天终于有时间安装SQL Server2016正式版,下载那个安装包都用了一个星期 安装包可以从这里下载: http://www.itellyou.cn/ ht ...

  9. Android5.1.1 - APK签名校验分析和修改源码绕过签名校验

    Android5.1.1 - APK签名校验分析和修改源码绕过签名校验 作者:寻禹@阿里聚安全 APK签名校验分析 找到PackageParser类,该类在文件“frameworks/base/cor ...

  10. Nova PhoneGap框架 第五章 文件结构

    一个好的项目架构必然有着合理的文件结构,如果一个项目的文件组织混乱,那么可以断言一定是项目架构有问题. 合理的文件结构能够帮你更清晰的管理你的文件,并且当需要添加新的文件的时候,你的程序员很清楚应该加 ...