zoukankan      html  css  js  c++  java
  • 【算法23】把字符串转换成整数

      【题   目】输入一个表示整数的字符串,把该字符串转换成整数并输出。例如:输入“123”,输出整数123.

      【思   路】当然首先想到的就是C语言库函数atoi,一行代码就完事了,当然我们是想不借助该库函数来实现自己的算法。首先,我们考虑怎么把字符串转换成整数,我们输入“123”,我们可以遍历这个字符串,首先读入1,然后读到2,这时我们想要的是12=1×10+2;然后读入3,我们想要的是123=12×10+3;分析到这里,我们就会发现,我们只需要注意遍历每一个字符,将已经得到的数字×10然后加上该字符,就能得到整数了,用一个循环就可以轻松搞定。

      算法的主体框架算是完成了,但是我们还要考虑特殊的输入情况;(1)如果是负数怎么办?我们可以首先判断第一个字符是不是正负号,是符号的话,最后记得将所得的数字加一个负号就OK了。(2)考虑非法输入的情况,如果用户输入的字符不是在0-9之间的字符,而是别的字符,我们返回什么,如果返回0,那么如果用户的确输入的是0,我们返回0;怎么区分这两种情况呢?我们可以用一个bool型的全局变量来存放是否是非法输入。(3)最后我们还要考虑,由于字符串的长度可以很长,那么它对应的整数就可能产生溢出,对于这种情况,我们也要进行处理。好了,经过这样的考虑,我们就可以写出如下的代码了:

     1 #include<iostream>
    2 #include<string>
    3 #include<limits>
    4 using namespace std;
    5
    6 bool validInput = false;
    7
    8 /************************************************
    9 /* 将数字字符串转换成对应的整数
    10 /************************************************/
    11 int StrToInt(const char* str)
    12 {
    13 validInput = false;
    14 bool IsMinus = false;
    15 const char* digit = str;
    16 long result = 0;
    17
    18 if(str != NULL)
    19 {
    20 //判断首字符是不是正负号
    21 if(*digit == '+')
    22 {
    23 digit++;
    24 }
    25 else if(*digit == '-')
    26 {
    27 IsMinus = true;
    28 digit++;
    29 }
    30
    31 //判断剩下的字符
    32 while(*digit != '\0')
    33 {
    34 //字符处于0-9之间的有效字符
    35 if(*digit >= '0' && *digit <= '9')
    36 {
    37 result = result * 10 + (*digit - '0');
    38
    39 //溢出,即大于最大的正数,小于最小的负数
    40 if((result > numeric_limits<int>::max() && !IsMinus) || (-result < numeric_limits<int>::min() && IsMinus))
    41 {
    42 result = 0;
    43 break;
    44 }
    45
    46 digit++;
    47 }
    48
    49 //其他在0-9之外的非法字符
    50 else
    51 {
    52 result = 0;
    53 break;
    54 }
    55
    56 }
    57
    58 //遍历到最后一个字符,说明是有效输入;检查正负号
    59 if(*digit == '\0')
    60 {
    61 validInput = true;
    62 if(IsMinus)
    63 {
    64 result = 0 - result;
    65 }
    66 }
    67 }
    68
    69 return static_cast<int>(result);
    70 }
    71
    72 int main()
    73 {
    74 cout<<"please enter your string:"<<endl;
    75 char *mystring = new char[100];
    76 cin>>mystring;
    77
    78 cout<<"your string convert to int number is:"<<endl;
    79 cout<<StrToInt(mystring)<<endl;
    80 cout<<"the status of your input is:"<<endl;
    81 cout<<validInput<<endl;
    82
    83 delete[] mystring;
    84
    85 return 0;
    86 }

      针对有效输入,无效输入的测试结果如下:


    References:

    程序员面试题精选100题:http://zhedahht.blog.163.com/blog/static/25411174200731139971/

    注:

    1)本博客所有的代码环境编译均为win7+VC6。所有代码均经过博主上机调试。

    2)博主python27对本博客文章享有版权,网络转载请注明出处http://www.cnblogs.com/python27/。对解题思路有任何建议,欢迎在评论中告知。


  • 相关阅读:
    怎样判断数组类型
    VS2017不能生成Database Unit Test项目
    Windows Server 远程桌面报错:No Remote Desktop License Servers Available
    TFS2018 获取所有Build变量及变量值
    C# 读写bat文件
    【PowerShell 学习系列】-- 删除Win10自带应用
    Win10
    【TFS】TFS2015链接TFS出现TF31002/TF400324问题解决方案
    【SQL Server 学习系列】-- 获取字符串中出现某字符的次数及字符某次出现的下标
    【.Net 学习系列】-- 利用Aspose转换Excel为PDF文件
  • 原文地址:https://www.cnblogs.com/python27/p/2290760.html
Copyright © 2011-2022 走看看