首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。
输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。
admin
2019-03-29
73
问题
输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。
选项
答案
enum Status {kValid = 0, kInvalid}; int g_nStatus = kValid; /////////////////////////////////////////////////////////////////////// // Convert a string into an integer /////////////////////////////////////////////////////////////////////// int StrToInt(const char* str) { g_nStatus = kInvalid; longlongnum = 0; if(str != NULL) { const char* digit = str; // the first char in the string maybe ’+’ or ’-’ bool minus = false; if(*digit == ’+’) digit ++; else if(*digit == ’-’) { digit ++; minus = true; } // the remaining chars in the string while(*digit != ’\0’) { if(*digit >= ’0’ && *digit <= ’9’) { num = num * 10 + (*digit - ’0’); // overflow if(num>std::numeric_limits
::max()) { num = 0; break; } digit++; } // if the char is not a digit, invalid input else { num = 0; break; } } if(*digit == ’\0’) { g_nStatus = kValid; if(minus) num = 0 - num; } } return static_cast
(num); }
解析
这道题尽管不是很难,学过C/C++语言一般都能实现基本功能,但不同程序员就这道题写出的代码有很大区别,可以说这道题能够很好地反应出程序员的思维和编程习惯,因此已经被包括微软在内的多家公司用作面试题。建议读者在往下看之前自己先编写代码,再比较自己写的代码和下面的参考代码有哪些不同。
首先我们分析如何完成基本功能,即如何把表示整数的字符串正确地转换成整数。还是以"345"作为例子。当我们扫描到字符串的第一个字符’3’时,我们不知道后面还有多少位,仅仅知道这是第一位,因此此时得到的数字是3。当扫描到第二个数字’4’时,此时我们已经知道前面已经一个3了,再在后面加上一个数字4,那前面的3相当于30,因此得到的数字是3*10+4=34。接着我们又扫描到字符’5’,我们已经知道了’5’的前面已经有了34,由于后面要加上一个5,前面的34就相当于340了,因此得到的数字就是34*10+5=345。
分析到这里,我们不能得出一个转换的思路:每扫描到一个字符,我们把在之前得到的数字乘以10再加上当前字符表示的数字。这个思路用循环不难实现。
由于整数可能不仅仅之含有数字,还有可能以’+’或者’-’开头,表示整数的正负。因此我们需要把这个字符串的第一个字符做特殊处理。如果第一个字符是’+’号,则不需要做任何操作;如果第一个字符是’-’号,则表明这个整数是个负数,在最后的时候我们要把得到的数值变成负数。
接着我们试着处理非法输入。由于输入的是指针,在使用指针之前,我们要做的第一件是判断这个指针是不是为空。如果试着去访问空指针,将不可避免地导致程序崩溃。另外,输入的字符串中可能含有不是数字的字符。每当碰到这些非法的字符,我们就没有必要再继续转换。最后一个需要考虑的问题是溢出问题。由于输入的数字是以字符串的形式输入,因此有可能输入一个很大的数字转换之后会超过能够表示的最大的整数而溢出。
现在已经分析的差不多了,开始考虑编写代码。首先我们考虑如何声明这个函数。由于是把字符串转换成整数,很自然我们想到:
int StrToInt(const char* str);
这样声明看起来没有问题。但当输入的字符串是一个空指针或者含有非法的字符时,应该返回什么值呢?0怎么样?那怎么区分非法输入和字符串本身就是”0”这两种情况呢?
接下来我们考虑另外一种思路。我们可以返回一个布尔值来指示输入是否有效,而把转换后的整数放到参数列表中以引用或者指针的形式传入。于是我们就可以声明如下:
bool StrToInt(const char *str, int& num);
这种思路解决了前面的问题。但是这个函数的用户使用这个函数的时候会觉得不是很方便,因为他不能直接把得到的整数赋值给其他整形变脸,显得不够直观。
前面的第一种声明就很直观。如何在保证直观的前提下当碰到非法输入的时候通知用户呢?一种解决方案就是定义一个全局变量,每当碰到非法输入的时候,就标记该全局变量。用户在调用这个函数之后,就可以检验该全局变量来判断转换是不是成功。
转载请注明原文地址:https://kaotiyun.com/show/SRmZ777K
0
程序员面试
相关试题推荐
TheUnitedStatesInterstateHighwaySystemisaninfrastructurefeatofunprecedentedproportions.Notonlydoesitjoinallfi
[A]Theperson-skillsmatchapproachtoselection[B]Theimpactsofbadselectiondecisions[C]Theimportanceofstructu
输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。
输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:{intm_nKey;ListNode*m_pNext;};
n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。
数据库的优化设计?
ASP.NET与ASP相比,主要有哪些进步?
自定义工具栏上的按钮添加“自动索引”按钮,删除“查找”按钮。
在Word97的编辑状态,执行“文件”菜单中的“保存”命令后()。A.将所有打开的文档存盘B.只能将当前文档存储在原文件夹的文件内C.可以将当前文档存储在已有的任意文件夹内D.可以先建立一个新文件夹,再将文档存储在该文件夹内
随机试题
Livingisrisky.Crossingtheroad,drivingacar,flying,swallowinganaspirintabletoreatingachickensandwichtheycana
仅含运动纤维成分的结构是
Asherman综合征可导致
A.C00-C75B.C97C.D00-D09D.D10-D36E.D37-D48根据动态的肿瘤分组,独立的多个部位的(原发)恶性肿瘤编码为
根据《处方药与非处方药流通管理暂行规定》,关于药品零售企业销售处方药、非处方药的说法,正确的有()。
爆炸是物质系统的一种极为迅速的物理的或化学的能量释放或转换过程,是系统蕴藏或瞬间形成的大量能量在有限的体积和极端的时间内,突然释放或转换的现象,爆炸现象最主要的特征是()。
某高层建筑地上38层,地下3层。地下三层为停车库及变电所、水泵房、冷水机房和锅炉房等动力中心。地上一层至五层(包括裙房在内)为商业用房,六层至二十层为办公用房,二十二层至三十七层为酒店宾馆。机电工程有给水排水、通风与空调、建筑电气、建筑智能、电梯和消防等分
地上车站站厅设备管理区应与站台、站厅公共区划分为不同的防火分区,设备管理区每个防火分区的最大允许建筑面积不应大于()m2;对于建筑高度大于24m的高架车站,其设备管理区每个防火分区的最大允许建筑面积不应大于()m2。
关于全国银行间市场质押式逆回购方的义务,下列说法正确的有( )。
某公司2017年度支出合理的工资薪金总额1000万元,按规定标准为职工缴纳基本社会保险费150万元,为受雇的全体员工支付补充养老保险费80万元,补充医疗保险45万元,为公司高管缴纳商业保险费30万元。根据企业所得税法律制度的规定,该公司2017年度发生的上
最新回复
(
0
)