把字符串转换成整数
来源:互联网 发布: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; }}
测试结果
参考资料
- C语言实现把字符串转换成整数
- 《剑指offer》 何海涛著
- 把字符串转换成整数
- 把字符串转换成整数
- 把字符串转换成整数
- 把字符串转换成整数 .
- 把字符串转换成整数
- 把字符串转换成整数
- 把字符串转换成整数
- 把字符串转换成整数
- 把字符串转换成整数
- 把字符串转换成整数
- 把字符串转换成整数
- 把字符串转换成整数
- 把字符串转换成整数
- 把字符串转换成整数
- 把字符串转换成整数
- 把字符串转换成整数
- 把字符串转换成整数
- 把字符串转换成整数
- 彩笔进阶,从现在开始!
- SpringBoot service层测试类
- Grafana + Zabbix --- 部署分布式监控系统
- ListView简单使用《二》—>CollectionView效果实现案例
- android 电池电量检测,充电显示效果
- 把字符串转换成整数
- Git 操作
- 2016/11/4学习工作日志
- A Tour of Machine Learning Algorithms
- 滤波器设计(2):经典FIR数字滤波器的设计
- android sqlite 创建数据库和表到安装路径下的 Helper类
- 剑指Offer(面试题14-18)
- 关系代数中的除法运算
- 一剂醒脑美女程序员