题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。

分析:这道题尽管不是很难,学过C/C++语言一般都能实现基本功能,但不同程序员就这道题写出的代码有很大区别,可以说这道题能够很好地反应出程序员的思维和编程习惯,因此已经被包括微软在内的多家公司用作面试题。

C自带 atoi的要求:

Convert string to integer

Parses the C-string str interpreting its content as an integral number, which is returned as a value of type int.

The function first discards as many whitespace characters (as in isspace) as necessary until the first non-whitespace character is found. Then, starting from this character, takes an optional initial plus or minus sign followed by as many base-10 digits as possible, and interprets them as a numerical value.

The string can contain additional characters after those that form the integral number, which are ignored and have no effect on the behavior of this function.

If the first sequence of non-whitespace characters in str is not a valid integral number, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed and zero is returned.

1、注意容易出错的地方:

(1)空指针的处理;一定注意代码的鲁棒性!

(2)忽略前面的空格,空格有多种表示方法;

(3)‘+'或者'-'的处理。因此需要把这个字符串的第一个字符做特殊处理。如果第一个字符是'+'号,则不需要做任何操作;如果第一个字符是'-'号,则表明这个整数是个负数,在最后的时候我们要把得到的数值变成负数。

(4)溢出问题,处理方式;int的范围为  - 0x 7FFF(FFFF) ~ 0x 7FFF(FFFF)。因为int 占4个字节,字节位数和开发环境有关系,有16位的也有32位的,现在大多数计算机是32位的,即范围为-0x7FFF~0x7FFF或者-0x7FFFFFFF~-0x7FFFFFFF。

(5)当字符串不能转化为整数的错误处理;采用数字后面有非数字字符时进行忽略的方式。

2、声明

首先我们考虑如何声明这个函数。由于是把字符串转换成整数,很自然我们想到:
int StrToInt(const char* str);

这样声明看起来没有问题。但当输入的字符串是一个空指针或者含有非法的字符时,应该返回什么值呢?0怎么样?那怎么区分非法输入和字符串本身就是”0”这两种情况呢?

接下来我们考虑另外一种思路。我们可以返回一个布尔值来指示输入是否有效,而把转换后的整数放到参数列表中以引用或者指针的形式传入。于是我们就可以声明如下:
bool StrToInt(const char *str,int& num);
这种思路解决了前面的问题。但是这个函数的用户使用这个函数的时候会觉得不是很方便,因为他不能直接把得到的整数赋值给其他整形,显得不够直观。
前面的第一种声明就很直观。如何在保证直观的前提下当碰到非法输入的时候通知用户呢?一种解决方案就是定义一个全局变量,每当碰到非法输入的时候,就标记该全局变量。用户在调用这个函数之后,就可以检验该全局变量来判断转换是不是成功。

不过在面试时,我们可以选用任意一种声明方式进行实现。但当面试官问我们选择的理由时,我们要对两者的优缺点进行评价。

第二种声明方式对用户而言非常直观,但使用了全局变量,不够优雅;而第一种思路是用返回值来表明输入是否合法,在很多API中都用这种方法,但该方法声明的函数使用起来不够直观。

3、实现

在c的atoi函数中对于不含数字或者不能转换的字符串输出0,这里同样采用此种方法。

bool isspace(char x)
{if(x==' '||x=='\t'||x=='\n'||x=='\f'||x=='\b'||x=='\r')return true;else  return false;
}int atoi(char *nptr)
{if( !nptr ){ //nullreturn 0;}int result = 0;         /* current result */bool isNeg = false;           /* if '-', then negative, otherwise positive *//* skip whitespace */while ( isspace(*nptr) )++nptr;if ( *nptr == '-'){isNeg = true;nptr++;  /* skip sign */}else if ( *nptr == '+'){isNeg = false;nptr++;  /* skip sign */}while ( *nptr != '\0') { //not end if( *nptr < '0' || *nptr > '9' ){  //non-numberbreak;}result = 10 * result + (*nptr - '0');     /* accumulate digit */if(result > 0X7FFFFFFF) /* over flow 32*/{cout << "over flow" << endl;result = 0;break;}nptr++;    /* get next  */}if (isNeg)result = - result;return result;
} 


面试题整理 1:将一个字符串转换为整数相关推荐

  1. 浅谈将一个字符串转换为整数

    前一段时间刷到"把一个字符串转换为整数"这道题.据说是微软面试开发工程师最常用到的一个问题.写出了最终版本之后,竟然花费了大量的时间,这让我感到自己考虑问题还不是那么全面.所以,以 ...

  2. (剑指Offer)面试题49:把字符串转换为整数

    题目: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 思路: 考虑+.-.空格.非数字字符,以及溢出问题 代码: #include <iostream>using na ...

  3. C语言试题三十二之编写函数function,它的功能是:将一个字符串转换为一个整数(不得调用c语言提供的将字符串转换为整数的函数)。

    1. 题目 请编写函数function,它的功能是:将一个字符串转换为一个整数(不得调用c语言提供的将字符串转换为整数的函数). 2 .温馨提示 C试题汇总里可用于计算机二级C语言笔试.机试.研究生复 ...

  4. 24.请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。

    24.请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数). 例如,若输入字符串"-1234",则函数把它转换为整数值- ...

  5. 编程参考 - C语言中将字符串转换为整数(转)

    C语言,主要有两种方法可以将字符串转为整数:atoi() 和 strtol(). 1,atoi() Syntax: int atoi(const char *str); 包含的头文件是:stdlib. ...

  6. 编程参考 - C语言中将字符串转换为整数

    C语言,主要有两种方法可以将字符串转为整数:atoi() 和 strtol(). 1,atoi() Syntax: int atoi(const char *str); 包含的头文件是:stdlib. ...

  7. 【剑指offer-Java版】49把字符串转换为整数

    字符串转换为整数 : atoi 可能的输入: 1 带符号数 2 无符号数 3 零 4 空指针 5 超出表示范围 – 暂时仅仅是直接退出且设置最小 – 可以考虑此时抛个异常 6 非法输入,比如并不是一个 ...

  8. python 把带小数的浮点型字符串转换为整数的解决方案

    python 把带小数的浮点型字符串转换为整数的解决方案 参考文章: (1)python 把带小数的浮点型字符串转换为整数的解决方案 (2)https://www.cnblogs.com/mlgjb/ ...

  9. 整数转化成字符串; 字符串转换为整数

    整数转化成字符串: 字符串转换为整数 /*整数转化成字符串*/ char *IntToStr(int num, char str[]) {int i = 0, j = 0;char temp[100] ...

最新文章

  1. EF 4.1+MVC3+Jquery Ajax+Json.Net+JqueryUI+IUnitOfWork+Repository 学习DEMO(暂停更新)
  2. 在centos 下安装配置基于gitosis 的git 服务
  3. 商品审核网页界面_商品模块数据库表解析(二)
  4. LAMP和LNMP去除index.php访问
  5. mfc exe 在繁体系统 乱码_成都市招标文件编制及备案系统使用技巧问答
  6. 【计算机科学基础】计算理论初步
  7. 【操作系统】竞争条件与临界区
  8. 会c 学plc编程语言,想学PLC编程?先弄清5种PLC专用语言!
  9. 视频格式转换完全进阶
  10. 特斯拉又发生车祸!电池夜间还自燃3次
  11. LeetCode第 252 场周赛 之5187. 收集足够苹果的最小花园周长
  12. python三国演义人物出场_Python教你查询《三国演义》书籍人物出场次序
  13. Python学习教程公开课:好玩的Python
  14. Finclip小程序宿主环境与微信小程序宿主环境
  15. 如何取消默认浏览器中hao123主页
  16. oracle语句调试,Oracle中使用fnd_log_messages调试的步骤
  17. 生死看淡,不服就GAN(九)----英伟达力作PGGAN实战,生成高清图片
  18. linux module 目录,linux module工具安装与使用
  19. 深蓝学院-视觉SLAM理论与实践-第十二期-第3章作业
  20. 永擎服务器主板稳定性,支持AMD 64核撕裂者、17块硬盘扩展,双万兆:永擎发布TRX40D8-2N2T高端服务器工作站主板...

热门文章

  1. 云端TensorFlow读取数据IO的高效方式
  2. 唯品会API网关设计与实践--转
  3. Apache Hadoop YARN – ResourceManager--转载
  4. android 8.0 移除静态注册广播
  5. 原生JS forEach()和map()遍历的区别以及兼容写法
  6. 签消费贷合同免费领取苹果手机? 捷信、马上等多家消费金融“躺枪”
  7. MySQL - Join关联查询优化 --- NLJ及BNL 算法初探
  8. Spring Cloud【Finchley】实战-06使用/actuator/bus-refresh端点手动刷新配置 + 使用Spring Cloud Bus自动更新配置
  9. Java-JDK动态代理
  10. 数据结构与算法笔记(七)—— 选择排序