把字符串转换成整数

来源:互联网 发布:vb在光标位置输入文字 编辑:程序博客网 时间:2024/04/30 18:00

问题描述

  问题:把一个字符串转换成整数。
  在今年的秋招中遇到这个题目。讲真,完全想不到用人单位的笔试试卷会这么水,照搬剑指offer。但细细思量,这个题目虽简单,却能很好地反应出程序员的思维和编程习惯。但在考场上尽写出了基本功能,忽略了特殊输入(如带符号位、非法输入)、系统能表示的最大正整数和最小的负整数以及溢出、异常处理等问题,就连对输入参数的合法性判断都没写,真是罪过。


问题分析

在学C语言的时候,学过

int atoi (const char * str);

  第一、atoi() 函数会扫描参数 str 字符串,所以在使用指针之前,我们要做的第一件是判断这个指针是不是为空。如果试着去访问空指针,将导致程序崩溃。
  第二、str字符串可能不完全是数字字符,如果str以空格开头,应跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时(‘\0’)就没有必要再继续转换,结束转换并返回结果。
  第三、也是最后一个要考虑的问题:溢出问题。由于输入的数字是以字符串的形式输入,因此有可能输入一个很大的数字转换之后会超过能够表示的最大的整数而溢出。
  第四、这个函数需要一个字符指针做为输入,需要一个变量返回转换后的结果,另外还需要返回转换的状态(成功转换和转换失败)。因此有下面两种函数声明方式。第一种声明方式第一种声明方式对用户而言非常直观,但需要使用了全局变量记录转换的状态,不够优雅;而第二种声明方式是用bool型返回值来表明转换的状态,转换结果用参数返回,在很多API中都用这种方法,但该方法声明的函数使用起来不够直观。网上的第一种声明方式的实现较多,可能是受C语言影响太大,毕竟在C语言提供的库函数中就是这种方式,本文侧重实现第二种声明。

int  StrToInt(const char * str);              //第一种声明方式bool StrToInt(const char * str,int & result);  //第二种声明方式

C++代码实现

#include <iostream>#include<limits>#include<string>using  namespace std;bool StrToInt(const char* str,long long int & result){    long long int num=0;    bool  flag=true;    if(str==NULL || *str == '\0')//字符串为空时,转换失败,此处不能用if(str == NULL)    {        flag=false;        return flag ;    }    while(isspace(*str)) //跳过空格    {        str++;    }    bool minus = false;    if(*str == '+')//通过第一个有效字符判断是正是负        str ++;    else if(*str == '-')    {        str ++;        minus = true;    }    while(*str!='\0')//字符串结束标志    {        if(isdigit(*str))        {            num = num * 10 + (*str - '0');            if(num < 0)//整数溢出的情况,若溢出肯定变为负数            {                flag=false;                break;            }            str ++;        }        else        {            if(num==0)     //当遇到第一个非数字字符时,num为0,转换失败                flag=false;            break;        }    }    if(flag)    {        if(minus)            result = 0 - num;//转化为负数的方式        else            result=num;    }    return flag;}int main (){    int i=0;    char myStr[100];    //cin.getline(myStr,20);    long long int temp;    cout<<"输出long long int型的最大值:"<<endl        <<std::numeric_limits<long long int>::max()<<endl;    cout<<"请输入第"<< ++i <<"组测试数据"<<endl;    while(cin.getline(myStr,100))    {        if(StrToInt(myStr,temp))        {            cout<<myStr<<"转化成功,结果为:"<<temp<<endl;        }        else            cout<<"转化失败!"<<endl ;        cout<<"请输入第"<< ++i <<"组测试数据"<<endl;    }}

测试结果

测试结果


参考资料

  1. C语言实现把字符串转换成整数
  2. 《剑指offer》 何海涛著
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 皮子背包掉颜色怎么办 gta5车子炸了怎么办 gta5钱多了怎么办 gta5技工不送车怎么办 考警察视力不行怎么办 警察经常熬夜该怎么办 武警部队中队长乱情怎么办 气动铆钉枪卡钉怎么办 汽车遥控器丢码怎么办 电表电池欠压怎么办 电表显示d0该怎么办 打印机打不出来怎么办 羽绒服内里跑绒怎么办 奥迪冷冻液不足怎么办 奥迪冷冻液报警怎么办 电脑输入时乱码怎么办 电信路由器坏了怎么办 高铁坐错车次了怎么办 数字万用表显示1怎么办 滚筒冼衣机接水接头漏水怎么办 奶块设备被禁封怎么办 奶块设备封禁怎么办 晚上衣服干不了怎么办 3dmax视图混乱怎么办 钉枪能打进肉里怎么办 公司迟发工资怎么办 打枪后一直耳鸣怎么办 打枪震的耳鸣怎么办 尚方宝剑弄丢了怎么办 九五出款被黑18w怎么办 很容易感动伤感哭怎么办 为什么安卓版ps打不开怎么办 遇见职业打假人怎么办 打假投诉极限次怎么办 导师无故留学生要怎么办 孩子24了不争气怎么办 退休工资卡遗失怎么办大同市 天津体育惠民卡怎么办 高跟鞋走路太响怎么办 高跟鞋太响怎么办妙招 穿高跟鞋想开车怎么办