/*
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,哈哈的更多相关文章

  1. libcurl使用easy模式阻塞卡死等问题的完美解决

    引言: 由于要在android手机测进行DM开发, 其中最重要的就是FUMO和SCOMO下载, 下载使用的是linux开源库libcurl. 于是就把libcurl的使用研究了一遍, 有些心得, 并解 ...

  2. 代码的坏味道(22)——不完美的库类(Incomplete Library Class)

    坏味道--不完美的库类(Incomplete Library Class) 特征 当一个类库已经不能满足实际需要时,你就不得不改变这个库(如果这个库是只读的,那就没辙了). 问题原因 许多编程技术都建 ...

  3. Visual Studio Code,完美的编辑器

    今日凌晨,微软的文本(代码)编辑器 Visual Studio Code(简称 VS Code),发布了首个正式版,距离首个 beta 版上线时间刚好一年. 在十多年的编程经历中,我使用过非常多的的代 ...

  4. 完美解决,浏览器下拉显示网址问题 | 完美解决,使用原生 scroll 写下拉刷新

    在 web 开发过程中我们经常遇到,不想让用户下拉看到我的地址,也有时候在 div 中没有惯性滚动,就此也出了 iScroll 这种关于滚动条的框架,但是就为了一个体验去使用一个框架好像又不值得,今天 ...

  5. 浏览器自动刷新——基于Nodejs的Gulp LiveReload与VisualStudio完美结合。

    本文版权桂博客园和作者吴双共同所有,转载和爬虫请注明原文地址 http://www.cnblogs.com/tdws/p/6016055.html 写在前面 大家好我是博客园的蜗牛,博客园的蜗牛就是我 ...

  6. HTML5 oninput实时监听输入框值变化的完美方案

    在网页开发中经常会碰到需要动态监听输入框值变化的情况,如果使用 onkeydown.onkeypress.onkeyup 这个几个键盘事件来监测的话,监听不了右键的复制.剪贴和粘贴这些操作,处理组合快 ...

  7. 【repost】JavaScript完美运动框架的进阶之旅

    运动框架的实现思路 运动,其实就是在一段时间内改变left.right.width.height.opactiy的值,到达目的地之后停止. 现在按照以下步骤来进行我们的运动框架的封装: 匀速运动. 缓 ...

  8. [LeetCode] Perfect Rectangle 完美矩形

    Given N axis-aligned rectangles where N > 0, determine if they all together form an exact cover o ...

  9. [LeetCode] String to Integer (atoi) 字符串转为整数

    Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...

随机推荐

  1. django分页工具

    from django.core.paginator import Paginator 此对象可以进行分页操作 objects = Entry.objects.all() page = Paginat ...

  2. ctrl+c关闭多线程python程序

    项目中经常需要用到多线程,如果一个python程序用了多线程,当子线程没有结束时,用ctrl+c是关闭不了主线程的,这时候就只能用kill命令杀掉,这样会很麻烦. 所以探讨了下怎么ctrl+C关闭多线 ...

  3. PL/SQL — BULK COLLECT用法

    BULK COLLECT 子句会批量检索结果,即一次性将结果集绑定到一个集合变量中,并从SQL引擎发送到PL/SQL引擎.通常可以在SELECT INTO.FETCH INTO以及RETURNING ...

  4. hadoop完全分布式安装(转)

    1 安装Vmware WorkStation软件 有些人会问,为何要安装这个软件,这是一个VM公司提供的虚拟机工作平台,后面需要在这个平台上安装linux操作系统.具体安装过程网上有很多资料,这里不作 ...

  5. Hanoi

    递归解决 汉诺塔 class Han{ int num; int steps; Han(int num){ this.num=num; } void total() { System.out.prin ...

  6. Twitter:蓄水池储水量问题

    早上买了两个饼夹肉,我吃了一个,辣椒粉好多,现在一直在实验室喝水. 一.倒数第n位 今年暑假去世纪佳缘面试,其中一题就是这个,只能遍历一遍链表求出倒数第n位. 答案是两个指针,第一个在头部设为A,第二 ...

  7. Fckeditor漏洞利用总结

    查看编辑器版本FCKeditor/_whatsnew.html——————————————————————————————————————————————————————— —————— 2. Ver ...

  8. C语言预处理运算符

    转自C语言预处理运算符 预处理还需要运算符?有没有搞错? ^_^, 没有搞错,预处理是有运算符,而且还不止一个: #(单井号)    -- 字符串化运算符. ##(双井号 )-- 连接运算符 #@   ...

  9. ubuntu下firefox安装Adobe Flash Player

    转自ubuntu系统自带的火狐(firefox)如何安装Adobe Flash 当你刚装完系统,发现打开某些网站时,提示你"需要安装flash",然后你点击确定,过了一会,提示你安 ...

  10. 关于Jquery中ajax方法data参数用法的总结

    data 发送到服务器的数据.将自动转换为请求字符串格式.GET 请求中将附加在 URL 后.查看 processData 选项说明以禁止此自动转换.必须为 Key/Value 格式.如果为数组,jQ ...