参考资料

(1)atoi函数的实现

(2)《剑指offer》

题目分析

本题需要注意的有几个方面:

(1)检查输入参数,指针是否为NULL;

(2)去除字符串前面的空格

(3)处理正负符号

(4)数值部分计算要注意:第一个是处理溢出;第二个是处理字符串中出现非数字符号的情况

(5)整体的错误处理选择:如果函数正确执行,应该返回转换后的数字,所以,就不能使用return某个数字来表示某个错误,而应该定义一个全局的错误变量errno,并在出现不同错误的时候设置该变量。

关于处理溢出的方案:

由于单独处理正负号,所以数值计算的值number不应出现负值,当出现负值的时候说明发生了溢出,这时再根据前面的正负号判断是正溢出还是负溢出,如果是正溢出,则将该值赋为最大正数,在C++中是:std::numeric_limits<int>::max();如果是负溢出,则将该值赋值为最小负数即可。


最后,贴上我的代码,地址是:https://github.com/duqicauc/CodeInterview/blob/master/StrToInt.cpp

#include <iostream>
#include <limits> using namespace std; //定义几个错误状态枚举
enum Status{kValid = 0,kNULL,kOVERFLOW,kCHAR};
int status = kValid; int strToInt(const char* str)
{
/* 空指针检查 */
if (str == NULL)
{
status = kNULL;
return 0;
} /* 处理字符串前面的几个空格 */
while(isspace(*str))
str++; /* 正负号处理 */
int flag = 1;
if (*str == '-')
{
flag = -1;
str++;
}
else if (*str == '+')
str++; /* 数值操作 */
int number = 0;
while(*str != '\0')
{
if (*str >= '0' && *str <= '9')
{
number = number * 10 + *str - '0';
/* 处理overflow,int类型的范围为[-2147483648,2147483647]*/
if (number < 0)
{
if(flag == 1)
number = std::numeric_limits<int>::max();
else if (flag == -1)
number = std::numeric_limits<int>::min();
status = kOVERFLOW;
return number;
}
str++;
}
else
{
/* 处理字符串中的非数字字符,策略是返回无效字符串状态 */
status = kCHAR;
break;
}
}
return number * flag;
} int main()
{
char str[80];
cout << "请输入字符串:" <<endl;
cin.getline(str,80); int result = strToInt(str);
switch(status){
case kValid:
cout << "字符串" << str << "对应的整数是:" << result <<endl;
break;
case kNULL:
cout << "空指针错误" <<endl;
break;
case kCHAR:
cout << "输入的字符串中有非数字字符" <<endl;
cout << result <<endl;
break;
case kOVERFLOW:
cout << "输入的字符串对应的数字使得Int类型溢出" <<endl;
cout << result <<endl;
}
return 0;
}

一道经典面试题,atoi函数的实现的更多相关文章

  1. 一道经典面试题-----setTimeout(function(){},0)

    一道经典面试题-----setTimeout(function(){},0) 转载: http://www.w3cfuns.com/notes/17398/e8a1ce8f863e8b5abb5300 ...

  2. 信雅达面试题atoi函数实现

    atoi函数: 功 能: 把字符串转换成整型数. 名字来源:ASCII to integer 的缩写. 原型: int atoi(const char *nptr); 函数说明 参数nptr字符串,如 ...

  3. 关于fork的一道经典面试题

    这是一道面试题,问程序最终输出几个“-”: #include<stdio.h> #include<sys/types.h> #include<unistd.h> i ...

  4. 经典面试题-python函数之默认参数

    1.可变的默认参数----list  示例: def add(a, mylist=[]): # print(id(mylist)) mylist.append(a) return mylist pri ...

  5. 关于global和$GLOBALS[]的一道经典面试题

    在不执行程序的情况下,你觉得的输出结果是什么? <?php $var1 = 1; $var2 = 2; function test(){ global $var1,$var2; $var2 = ...

  6. 【经典面试题】实现平方根函数sqrt

    本文将从一道经典的面试题说起:实现平方根函数,不得调用其它库函数. 函数原型声明例如以下: double Sqrt(double A); 二分法 二分法的概念 求,等价于求方程的非负根(解).求解方程 ...

  7. 解析js中作用域、闭包——从一道经典的面试题开始

    如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎 ...

  8. 一道经典的js面试题

    # 声明:学习编程语言最好的方式就是通过实例学习 ## 下面是我在博客上看到的一道js面试题,可以说非常经典,下面会以最简单的方式让你理解题目:```bashfunction Foo() { getN ...

  9. OpenJDK源码研究笔记(五)-缓存Integer等类型的频繁使用的数据和对象,大幅度提升性能(一道经典的Java笔试题)

    摘要 本文先给出一个看似很简单实则有深意的Java笔试面试题,引出JDK内部的缓存. JDK内部的缓存,主要是为了提高Java程序的性能. 你能答对这道"看似简单,实则有深意"的J ...

随机推荐

  1. Mysql模糊查询like提速优化

    LOCATE('substr',str,pos)方法 SELECT LOCATE('xbar',`foobar`); ###返回0 SELECT LOCATE('bar',`foobarbar`); ...

  2. CefSharp中文帮助文档

    https://github.com/cefsharp/CefSharp/wiki/CefSharp%E4%B8%AD%E6%96%87%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A ...

  3. WebGL学习笔记(十二):加载模型文件

    目前为止,我们用到的模型顶点uv信息等,都是直接定义在代码中的,实际使用中,这些数据应该是由3D编辑器编辑好后按照一定的格式存储在文件中的,我们需要从文件中提取出对应的数据之后,组合成我们可以使用的信 ...

  4. SVM – 核函数

    核函数的起源是对于线性不可分的分类情况,其实可以通过p次方多项式,及非线性模型进行分类:然后对于这类非线性多次方的,其实可以按照广义线性模型来进行升维变形,使之成为线性模型,这样就可以放到SVM中来进 ...

  5. ASP.NET LinqDataSource数据绑定后,遇到[MissingMethodException: 没有为该对象定义无参数的构造函数。]问题。

    问题出现的情形:LinqDataSource数据绑定到DetailsView或GridView均出错,错误如下: “/”应用程序中的服务器错误. 没有为该对象定义无参数的构造函数. 说明: 执行当前 ...

  6. java html实体转义

    public static void main(String[] args) { String str = " -<->-&-"-&apos;" ...

  7. .NET HttpWebRequest应用

    提供基于HttpWebRequest的请求的应用类,其中包含:get请求(带参或不带参).post请求.文件传输请求 方法的具体说明: PostHttp:post请求,支持三种提交模式:FROM.JS ...

  8. Hadoop window win10 基础环境搭建(2.8.1)(转)

    下面运行步骤除了配置文件有部分改动,其他都是参照hadoop下载解压的share/doc/index.html. hadoop下载:http://apache.opencas.org/hadoop/c ...

  9. C++ 智能指针 shared_ptr 分析

    引文: C++对指针的管理提供了两种解决问题的思路: 1.不允许多个对象管理一个指针 2.允许多个对象管理一个指针,但仅当管理这个指针的最后一个对象析构时才调用delete ps:这两种思路的共同点就 ...

  10. [转帖]期待下一个十年|CIS 2019温馨回顾(附PPT下载)

    期待下一个十年|CIS 2019温馨回顾(附PPT下载) https://www.freebuf.com/fevents/222236.html shidongqi2019-12-06共26587人围 ...