1. // 面试题67:把字符串转换成整数
  2. // 题目:请你写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不
  3. // 能使用atoi或者其他类似的库函数。
  4.  
  5. #include <iostream>
  6.  
  7. long long StrToIntCore(const char* str, bool minus);
  8.  
  9. enum Status { kValid = , kInvalid };
  10. int g_nStatus = kValid;//设置全局错误变量,用来反映无效输入
  11.  
  12. int StrToInt(const char* str)
  13. {
  14. g_nStatus = kInvalid;
  15. long long num = ;//可能是大数,注意long long
  16.  
  17. if (str != nullptr && *str != '\0')//无效输入情况,空指针和头结点为'\0'
  18. {
  19. bool minus = false;//设置局部变量,反映正负号
  20. if (*str == '+')
  21. str++;
  22. else if (*str == '-')
  23. {
  24. str++;
  25. minus = true;
  26. }
  27.  
  28. if (*str != '\0')//需要再次判断
  29. num = StrToIntCore(str, minus);
  30. }
  31.  
  32. return (int)num;
  33. }
  34.  
  35. long long StrToIntCore(const char* digit, bool minus)
  36. {
  37. long long num = ;
  38.  
  39. while (*digit != '\0')//如果不为'\0'
  40. {
  41. if (*digit >= '' && *digit <= '')//且字符是0~9之间的字符
  42. {
  43. int flag = minus ? - : ;//是负数吗
  44. num = num * + flag * (*digit - '');//使用负数加到num里
  45.  
  46. if ((!minus && num > 0x7FFFFFFF)//如果向上溢出了,还有一个符号位供缓冲
  47. || (minus && num < (signed int)0x80000000))//向下溢出,同理,都返回0
  48. {
  49. num = ;
  50. break;
  51. }
  52.  
  53. digit++;
  54. }
  55. else//要是有非正常字符,返回0
  56. {
  57. num = ;
  58. break;
  59. }
  60. }
  61.  
  62. if (*digit == '\0')//如果只有字符'0',g_nStatus是有效的,其他返回0的情况,g_nStatus都是无效的
  63. g_nStatus = kValid;
  64.  
  65. return num;
  66. }
  67.  
  68. // ====================测试代码====================
  69. void Test(const char* string)
  70. {
  71. int result = StrToInt(string);
  72. if (result == && g_nStatus == kInvalid)
  73. printf("the input %s is invalid.\n", string);
  74. else
  75. printf("number for %s is: %d.\n", string, result);
  76. }
  77.  
  78. int main(int argc, char* argv[])
  79. {
  80. Test(nullptr);
  81.  
  82. Test("");
  83.  
  84. Test("");
  85.  
  86. Test("+123");
  87.  
  88. Test("-123");
  89.  
  90. Test("1a33");
  91.  
  92. Test("+0");
  93.  
  94. Test("-0");
  95.  
  96. //有效的最大正整数, 0x7FFFFFFF
  97. Test("+2147483647");
  98.  
  99. Test("-2147483647");
  100.  
  101. Test("+2147483648");
  102.  
  103. //有效的最小负整数, 0x80000000
  104. Test("-2147483648");
  105.  
  106. Test("+2147483649");
  107.  
  108. Test("-2147483649");
  109.  
  110. Test("+");
  111.  
  112. Test("-");
  113. system("pause");
  114. return ;
  115. }

《剑指offer》第六十七题(把字符串转换成整数)的更多相关文章

  1. 剑指offer四十九之把字符串转换成整数

    一.题目 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 二.思路 详见代码. 三.代码 public class Solution { ...

  2. 《剑指offer》面试题67. 把字符串转换成整数

    问题描述 写一个函数 StrToInt,实现把字符串转换成整数这个功能.不能使用 atoi 或者其他类似的库函数.   首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. ...

  3. 剑指Offer(二十七):字符串的排列

    剑指Offer(二十七):字符串的排列 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...

  4. 《剑指offer》第二十七题(二叉树的镜像)

    // 面试题27:二叉树的镜像 // 题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像. #include <iostream> #include "BinaryTree ...

  5. 《剑指offer》第十七题(打印1到最大的n位数)

    // 面试题17:打印1到最大的n位数 // 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则 // 打印出1.2.3一直到最大的3位数即999. #include <ios ...

  6. 剑指Offer(三十七):数字在排序数组中出现的次数

    剑指Offer(三十七):数字在排序数组中出现的次数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.n ...

  7. 剑指offer第六章

    剑指offer第六章 1.数字在排序数组中出现的次数 统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在数组中出现了4次,所以输出4 分析:思路1 ...

  8. 力扣 - 剑指 Offer 67. 把字符串转换成整数

    题目 剑指 Offer 67. 把字符串转换成整数 思路1 根据题意,要解决这题,首先要判断的条件有: 不包括首位空格 第一位必须为:+.-.数字三者其一,否则不合法 数字必须连续的,如果遇到非数字, ...

  9. 【Java】 剑指offer(67) 把字符串转换成整数

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请你写一个函数StrToInt,实现把字符串转换成整数这个功能 ...

  10. 剑指Offer - 九度1508 - 把字符串转换成整数

    剑指Offer - 九度1508 - 把字符串转换成整数2014-02-06 23:46 题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 输入: 输入可能包含多个测试样例 ...

随机推荐

  1. K8S学习笔记之Kubernetes核心概念

    0x00  Kubernetes简介 Kubernetes(K8S)是Google开源的容器集群管理系统,其设计源于Google在容器编排方面积累的丰富经验,并结合社区创新的最佳实践. K8S在Doc ...

  2. Java学习笔记之Linux下的Java安装和配置

    0x00 概述 由于使用 yum 或者 apt-get 命令 安装 openjdk 可能存在类库不全,从而导致用户在安装后运行相关工具时可能报错的问题,所以此处我们推荐采用手动解压安装的方式来安装 J ...

  3. jQuery常用插件与jQuery使用validation插件实现表单验证实例

    jQuery常用插件 1,jQuery特别容易扩展,开发者可以基于jQuery开发一些扩展动能 2,插件:http://plugins.jquery.com 3,超厉害的插件:validation . ...

  4. windows10 hyper-v安装配置centos6.8

    27.PNG 选择最小化安装,并在界面下方选中自定义额外的安装包 28.PNG 选择额外的安装包 29.PNG 选择额外的安装包 30.PNG 终于开始安装了 31.PNG 安装完毕,重启 32.PN ...

  5. CCF 推荐国际国内会议及中文核心期刊要目总览

    CCF 推荐国际国内会议及<中文核心期刊要目总览> Ref :http://www.ccf.org.cn/xspj/rgzn/ Notes: dblp 是一个好网站,上面有各种主要会议的论 ...

  6. Debian\CentOS Linux配置管理

    CentOS 6 安装 gcc-4.8 以支持 C++11 1.下载 repo 文件 wget http://people.centos.org/tru/devtools-2/devtools-2.r ...

  7. opencv学习之路(14)、形态学之膨胀腐蚀

    一.膨胀腐蚀概述(对高亮部分进行操作) 二.膨胀 三.腐蚀 四.代码 1.查看结构元素 #include<opencv2/opencv.hpp> #include<iostream& ...

  8. kali linux 64bit 2019.1a下启动bbqsql:No module named coros

    kali linux 64bit 2019.1a下bbqsql启动失败,错误: File "/usr/local/lib/python2.7/dist-packages/bbqsql/lib ...

  9. 动态规划之91 decode ways

    题目链接:https://leetcode-cn.com/problems/decode-ways/description/ 参考:https://www.jianshu.com/p/5a604070 ...

  10. Difference between ID and control.ClientID OR why use control.ClientID if I can access control through ID

     https://stackoverflow.com/questions/3743582/difference-between-id-and-control-clientid-or-why-use-c ...