面试题49 把字符串转换为整数

来源:互联网 发布:美国离线导航软件 编辑:程序博客网 时间:2024/06/08 02:44
【题   目】输入一个表示整数的字符串,把该字符串转换成整数并输出。例如:输入“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)最后我们还要考虑,由于字符串的长度可以很长,那么它对应的整数就可能产生溢出,对于这种情况,我们也要进行处理。

好了,经过这样的考虑,我们就可以写出如下的代码了:

[html] view plaincopy
  1. #include<iostream>  
  2.  #include<string>  
  3.  #include<limits>  
  4.  using namespace std;  
  5.    
  6.  bool validInput = false;   //是否合法输入   用来区分是不是非法输入 返回的0
  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)    //非空字符串  否则输出 0
  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.  }  
0 0
原创粉丝点击