完美atoi,哈哈
/*
atoi算法,要求完美版
有两种,一种是用longlong,一种是真用int
“”
" "
“-”
“+”
“ -23”
“ +23”
“12a"
"abc"
越界情况
*/
#include <iostream>
using namespace std; //方法一用 long long 取巧
int atoi(const char * str,bool & flag)
{
long long result=;
int tmp;
int sign=;
if(str==NULL)
{
flag=false;
return ;
}
while(isspace(*str))
str++;
//if(*str=='\0')
//{
// flag=false;
// return 0;
//}
if(*str=='+'||*str=='-')
{
if(*str=='-')
sign=-;
str++;
}
if(*str=='\0') //” “和”+“ ,”-“的情况
{
flag=false;
return ;
}
while(*str>=''&&*str<='')
{
tmp=*str-'';
result=result*+tmp;
if(sign==-)
{
if(result->INT_MAX) //这里注意,如果是INT_MAX+1,系统或默认转换成int,导致越界,所以用result-1,result是longlong不会越界
{
result=INT_MAX+;
flag=false;
break;
}
}
else if(result>INT_MAX)
{
result=INT_MAX;
flag=false;
break;
}
str++;
}
if(*str=='\0')
flag=true;
else
flag=false;
return sign*result;
} //方法二 用int
int atoi2(const char * str ,bool & flag)
{
int result=;
int sign=;
int tmp;
int MAX_DIV=INT_MAX/;
int MAX_R=INT_MAX%;
int MIN_R=MAX_R+; //或者为MIN_R=-(INT_MIN%10); //如果用(INT_MAX+1)%10就错了,直接加的时候越界
int MIN_DIV=(INT_MAX)/; //july用的是max=(int)((unsigned)~0>>1);
//min_r=(int)(((unsigned)~0>>1+1)%10);
if(str==NULL)
{
flag=false;
return result;
}
while(isspace(*str))
str++;
if(*str=='+'||*str=='-')
{
if(*str=='-')
sign=-;
str++;
}
if(*str=='\0')
{
flag=false;
return result;
}
while(*str>=''&&*str<='')
{
int tmp=*str-'';
if(sign==)
{
if(result>MAX_DIV||(result==MAX_DIV&&tmp>MAX_R))
{
result=INT_MAX;
flag=false;
return result;
}
}
else if(result>MIN_DIV||(result==MIN_DIV&&tmp>MIN_R))
{
result=INT_MIN; //result直接为最小-2147483648,直接返回了
flag=false;
return result;
}
result=result*+tmp;
str++;
}
if(*str=='\0')
flag=true;
else
flag=false;
return sign*result;
} int main()
{
char * str[]={""," ","abc",""," -1234"," +34"," 12bc","+","-","+++","","","+2147483648","-2147483648","-2147483649","+12123131312432342"," -122323434534534654"};
//cout<<INT_MAX<<endl;
int n=;
bool flag;
for(int i=;i<n;i++)
{
int tmp=atoi2(str[i],flag);
if(tmp==)
{
if(flag==false)
cout<<str[i]<<" 错误数据转换为: "<<tmp<<endl;
else
cout<<str[i]<<" 转换为: "<<tmp<<endl;
}
else
{
cout<<str[i]<<" 转换为: "<<tmp<<endl;
}
}
system("pause");
}
完美atoi,哈哈的更多相关文章
- libcurl使用easy模式阻塞卡死等问题的完美解决
引言: 由于要在android手机测进行DM开发, 其中最重要的就是FUMO和SCOMO下载, 下载使用的是linux开源库libcurl. 于是就把libcurl的使用研究了一遍, 有些心得, 并解 ...
- 代码的坏味道(22)——不完美的库类(Incomplete Library Class)
坏味道--不完美的库类(Incomplete Library Class) 特征 当一个类库已经不能满足实际需要时,你就不得不改变这个库(如果这个库是只读的,那就没辙了). 问题原因 许多编程技术都建 ...
- Visual Studio Code,完美的编辑器
今日凌晨,微软的文本(代码)编辑器 Visual Studio Code(简称 VS Code),发布了首个正式版,距离首个 beta 版上线时间刚好一年. 在十多年的编程经历中,我使用过非常多的的代 ...
- 完美解决,浏览器下拉显示网址问题 | 完美解决,使用原生 scroll 写下拉刷新
在 web 开发过程中我们经常遇到,不想让用户下拉看到我的地址,也有时候在 div 中没有惯性滚动,就此也出了 iScroll 这种关于滚动条的框架,但是就为了一个体验去使用一个框架好像又不值得,今天 ...
- 浏览器自动刷新——基于Nodejs的Gulp LiveReload与VisualStudio完美结合。
本文版权桂博客园和作者吴双共同所有,转载和爬虫请注明原文地址 http://www.cnblogs.com/tdws/p/6016055.html 写在前面 大家好我是博客园的蜗牛,博客园的蜗牛就是我 ...
- HTML5 oninput实时监听输入框值变化的完美方案
在网页开发中经常会碰到需要动态监听输入框值变化的情况,如果使用 onkeydown.onkeypress.onkeyup 这个几个键盘事件来监测的话,监听不了右键的复制.剪贴和粘贴这些操作,处理组合快 ...
- 【repost】JavaScript完美运动框架的进阶之旅
运动框架的实现思路 运动,其实就是在一段时间内改变left.right.width.height.opactiy的值,到达目的地之后停止. 现在按照以下步骤来进行我们的运动框架的封装: 匀速运动. 缓 ...
- [LeetCode] Perfect Rectangle 完美矩形
Given N axis-aligned rectangles where N > 0, determine if they all together form an exact cover o ...
- [LeetCode] String to Integer (atoi) 字符串转为整数
Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...
随机推荐
- python mysqldb连接数据库
今天无事想弄下python做个gui开发,最近发布的是python 3k,用到了数据库,通过搜索发现有一个mysqldb这样的控件,可以使用,就去官方看了下结果,没有2.6以上的版本 没办法就下了一个 ...
- Dede 列表页 缩略图 有显示无则不显示
[field:array runphp='yes']@me = (strpos(@me['litpic'],'defaultpic') ? "" : "<div c ...
- hdu 4358 Boring counting 离散化+dfs序+莫队算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4358 题意:以1为根节点含有N(N <= 1e5)个结点的树,每个节点有一个权值(weight ...
- 基于BOOST 实现并发服务器框架
一:设计思路 本服务器框架使用 UDP 传输协议,程序柱线程等待客户端数据,并将数组存取队列缓冲区.另外可开启多个工作线程,工作线程可以依据具体项目实现不同的功能 ,例如可以将队列缓冲区中的数据逐个取 ...
- Hive优化(转)
一.join优化 Join查找操作的基本原则:应该将条目少的表/子查询放在 Join 操作符的左边.原因是在 Join 操作的 Reduce 阶段,位于 Join 操作符左边的表的内容会被加载进内存, ...
- ViewController 之间设置转场动画
AddOrEditViewController *addOrEdit = [[AddOrEditViewController alloc] init]; CATransition *transitio ...
- CSS3实战:让我们尽情的圆角吧
如果说,WAP2.0网页的机型.浏览器适配给我们无线制作经理造成了巨大的心理 阴影,那么从iPhone.Android这些高端手机应用 起,我们终于可以庆幸比其他同行提 前迎来了一个新时代,这两种高端 ...
- PHP漏洞全解(五)-SQL注入攻击
本文主要介绍针对PHP网站的SQL注入攻击.所谓的SQL注入攻击,即一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患.用户可以提交一段数据库查询代码,根据程序返 ...
- flash 类和对象的关系
每个具体的对象后面都隐藏着抽象的类. flash 中as3.0中所有的类,都是为了创建对象所用的.反过来,所创建的任何具体对象都隐藏着抽象的类. 类可以把它看做函数,类的属性是函数的数据,类的方法是函 ...
- 坚果云创业团队访谈:我们 DIY 云存储(不要过度关注竞争对手,尤其当我们还是小公司的时候)
坚果云(http://jianguoyun.com/)是一款用于多平台文件同步.备份和交换的云存储工具,立志于提供“便捷,安全”的服务.坚果云自去年年初启动内测,至今年三月初刚刚正式发布.近日我们拜访 ...