解题笔记(11)——字符串转换为整数

本文介绍了一种将字符串转换为整数的方法,并详细讨论了多种异常情况的处理方式,包括空指针、非法字符、溢出等,确保了程序的健壮性和准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       问题描述:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。

       思路:转换的过程比较简单,每次读入一个字符,将之前保存的值乘以10,然后再加上这个字符表示的数字。这是正常情况。这个问题主要是考察各种不正常情况的处理。假设函数的声明为 int StrToInt(const char *str);

       (1)输入的字符串指针为空;

       (2)数字前面有正负号的处理;

       (3)字符串表示的数字超过了32位整数能表示的范围,即溢出处理;

       (4)输入了非法字符,即除了数字及正负号的其他字符;

       (5)以字符' 0 '开始的串,' 0 '后面还跟了其他字符,也是非法的。

        如果能很好的处理这些情况,那么程序的健壮性大大增强。其中有两种情况处理起来有点麻烦,第一,如何处理溢出,我们可以使用std::numeric_limits<int>::max(),可以定义一个long long的变量,然后与这个最大值相比,从而判断是否溢出了。第二。由于返回值为一个整型数,那么如果转换失败,返回什么呢?如果是'0 ' ,那么就无法区分正常输入"0"的情况。两种方案,修改函数声明,通过返回值表明转换的成功与否,或者定义一个全局变量,用来保存转换的成功与否。参考代码中使用了第二种方案。

        参考代码:先给出的是std::numeric_limits<int>::max()的用法。

  1. #include <iostream>  
  2. #include <limits>    //需包含这个头文件  
  3. using namespace std;  
  4. int main() {  
  5.    cout << "The maximum value for type float is:  "  
  6.         << numeric_limits<float>::max( )  
  7.         << endl;  
  8.    cout << "The maximum value for type double is:  "  
  9.         << numeric_limits<double>::max( )  
  10.         << endl;  
  11.    cout << "The maximum value for type int is:  "  
  12.         << numeric_limits<int>::max( )  
  13.         << endl;  
  14.    cout << "The maximum value for type short int is:  "  
  15.         << numeric_limits<short int>::max( )  
  16.         << endl;  
  17. }  

           

  1. bool strToIntOK; //全局的变量    
  2. int StrToInt(const char *str)    
  3. {    
  4.     strToIntOK = false;    
  5.     if(str == NULL)  //空指针    
  6.         return 0;    
  7.         
  8.     if(str[0] == '0' && str[1] != '\0'//以'0'开始但不是"0" 这条其实可以忽略    
  9.         return 0;    
  10.         
  11.     unsigned i = 0;    
  12.     bool minus = false;    //负数标记    
  13.     if(str[i] == '-' || str[i] == '+')  //判断是不是以正负号开始    
  14.     {    
  15.         minus = (str[i] == '-')? truefalse;    
  16.         i++;    
  17.     }    
  18.         
  19.     long long result = 0;  //转换的结果   
  20.     while(str[i] != '\0')    
  21.     {    
  22.         char c = str[i++];    
  23.         if(c >= '0' && c <='9')    
  24.         {    
  25.             result = result * 10 + (c - '0');    
  26.             if(minus) //负溢出  
  27.             {  
  28.                 if(result - 1 > numeric_limits<int>::max())   
  29.                     return 0;    
  30.             }  
  31.             else //正溢出  
  32.             {  
  33.                 if(result > numeric_limits<int>::max())  
  34.                     return 0;    
  35.             }  
  36.         }    
  37.         else    
  38.         {    
  39.             return 0;    
  40.         }    
  41.     }    
  42.     strToIntOK = true;    
  43.     //结果返回 需强制转换一下    
  44.     return minus? (int)(-result):(int)result;    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值