标准库函数atoi的实现
标准库函数atoi用于将字符串类型的数据转换为整形数据:在转换过程中要考虑空指针、空字符串""、正负号,溢出等情况
这里是将字符串str转换为32位整型,其正数的最值为0x7FFFFFFF,负数的最小值为0x80000000(可参考有符号类型的最小负数的补码的由来),通过这两个值来判断是上溢还是下溢,此外,用一个全局变量来表明是否是非法输入的问题。
代码如下:(vs2010调试正确)
//实现atoi_32函数
//正数数的最大值为0x7FFFFFFF,最小值为0x80000000,考虑数字会溢出的情况
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h> enum {kValid = ,kInvalid};
int g_nStatus = kValid; //全局变量用于判断是非法输入还是字符串为空 long long StrToInt(const char *s,int sign)
{
long long num = ;
while(*s != '\0'){
if(!isdigit(*s)){
g_nStatus = kInvalid; //表示非法输入
num = ;
break;
}
num = num * + *s - '';
if(sign > && sign * num > 0x7FFFFFFF ||
sign < && sign * num < (signed int)0x80000000){ //注意这里的类型提升,因此要强制转换
num = ;
break;
}
s++;
}
return sign * num;
}
int atoi_32(const char *s)
{
long long num;
int sign;
sign = ; if(s == NULL || *s == '\0'){
return ;
}
if(*s == '+')
++s;
else if (*s == '-'){
++s;
sign = -;
}
if (*s == '\0'){
g_nStatus = kInvalid; //表示非法输入
return ;
}
else
num = StrToInt(s,sign); return (int)num;
} int main()
{
char s[];
gets(s);
printf("%d\n",atoi_32(s));
system("pause");
return ;
}
PS:参考《剑指offer》
标准库函数atoi的实现的更多相关文章
- C语言提供了几个标准库函数 itoa() atoi()
C语言提供了几个标准库函数C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串.以下是用itoa()函数将整数转换为字符串的一个例子: # include <s ...
- C89标准库函数手册(待整理)
http://zh.cppreference.com/w/c 前言 ANSI C(C89)标准库函数共有15个头文件.这15个头文件分别为: 1.<assert.h> ...
- C++ - 常用的标准库函数
写在前面 C++是一门博大精深的语言,也是最难学的一门编程语言,每一位励志学好C++的程序员都需要从基本功开始,稳扎稳打. 自从1998年C++ standard定案以后,C++程序库便有了大幅扩 ...
- C语言中最常用标准库函数
标准头文件包括: <asset.h> <ctype.h> <errno.h> <float.h> <limits ...
- C89标准库函数手册
http://zh.cppreference.com/w/c 前言 ANSI C(C89)标准库函数共有15个头文件.这15个头文件分别为: 1.<assert.h> ...
- C语言中最常用的标准库函数
标准头文件包括: <asset.h> <ctype.h> <errno.h> <float.h> <limits ...
- 转载 C++常用库函数atoi,itoa,strcpy,strcmp的实现
C++常用库函数atoi,itoa,strcpy,strcmp的实现 C语言字符串操作函数 1. 字符串反转 - strRev2. 字符串复制 - strcpy3. 字符串转化为整数 - atoi4. ...
- 范围for语句 && 列表初始值&& 标准库函数begin和end
范围for语句: 引入的意义:简化传统for的编写,主要用于遍历给定序列中的每个元素并对序列中的每个值执行某种操作,其语法形式是: for( 声明: 给定序列) { 执行的操作. } 其中,“给定序列 ...
- UC编程:通过fwrite()和write()比较标准库函数和系统调用的速度
fwrte是C标准库中提供的函数,是对write函数的扩展与封装,write则是Unix系统提供的函数.按照常理来讲,系统调用肯定比使用库快的多,但是事实正好相反 Why?原因就在于缓冲的问题,fwi ...
随机推荐
- c运行库冲突问题
按照网上的方法,各种调试不成功,后来改成用共享MFC的dll,然后回退新加的代码,再把 #include <afxwin.h> #ifndef _AFX_NO_DB_SUPPORT#inc ...
- Mac OSX 无法SSH远程的原因
在mac中开启了远程共享,拿windows上的putty 死活无法ssh上去. 后来下载了个新版的putty, 连上了.
- JAVA OOP 基础知识提纲
OOP: 面向对象: 认识事物的一个过程,是整体(特征/行为) 认识事物的方式.人类认识事物的自然思维习惯. 对象及类 对象是实实在在具体存在的东西,主要是从两个角度(行为,特征)去观察 类:是一组具 ...
- @HTML.checkboxFor()用法
<%=Html.CheckBox("chk1",true) %> <%=Html.CheckBox("chk1", new { @class= ...
- Web Service平台概述
Web Service平台主要涉及的技术有SOAP(Simple Object Access Protocal,简单对象访问协议), WSDL(Web Service Descriptio ...
- code of C/C++ (1)
去年,王老师拷贝给我一些代码,非常感激,老爷子的水平我这个小辈只能仰视,代码都是来自他所教的课程,有些课程因为这几年据说太难都给取消掉了,实在是 我们学校的损失. C/C++代码都是在讲述一些非常基本 ...
- asp.net mvc处理css和js版本问题
当服务的修改了js和css内容后,发布到IIS服务器上,总是导致客户端内容显示不正确,原因是客户端存在缓存,还是加载的原来的js和css问题. 在css或js后面添加版本号,例如: <scrip ...
- Scala深入浅出实战经典---001-Scala开发环境搭建和HelloWorld解析
001-Scala开发环境搭建和HelloWorld解析 Scala 函数式编程和面向对象结合的语言 函数式编程擅长数值计算 面向对象擅长大型工程和项目的组织以及团队的分工协作 Scala会是下一个伟 ...
- HTML5新增Canvas标签及对应属性、API详解(基础一)
知识说明: HTML5新增的canvas标签,通过创建画布,在画布上创建任何想要的形状,下面将canvas的API以及属性做一个整理,并且附上时钟的示例,便于后期复习学习!Fighting! 一.标签 ...
- JSON序列化和反序列化的实例
之前有项目中使用到了Json的序列化和反序列化,现在将使用的实例记录下来以备查阅.如有不妥,请指教. 代码的最终目的是得到一个符合 resultClass<List<rtnGetFindM ...