一道经典面试题,atoi函数的实现
2014-04-13 11:19
363 查看
参考资料
(1)atoi函数的实现(2)《剑指offer》题目分析
本题需要注意的有几个方面:(1)检查输入参数,指针是否为NULL;(2)去除字符串前面的空格(3)处理正负符号(4)数值部分计算要注意:第一个是处理溢出;第二个是处理字符串中出现非数字符号的情况(5)整体的错误处理选择:如果函数正确执行,应该返回转换后的数字,所以,就不能使用return某个数字来表示某个错误,而应该定义一个全局的错误变量errno,并在出现不同错误的时候设置该变量。关于处理溢出的方案:由于单独处理正负号,所以数值计算的值number不应出现负值,当出现负值的时候说明发生了溢出,这时再根据前面的正负号判断是正溢出还是负溢出,如果是正溢出,则将该值赋为最大正数,在C++中是:std::numeric_limits<int>::max();如果是负溢出,则将该值赋值为最小负数即可。
最后,贴上我的代码,地址是:https://github.com/duqicauc/CodeInterview/blob/master/StrToInt.cpp
#include <iostream>
#include <limits>using namespace std;//定义几个错误状态枚举
enum Status{kValid = 0,kNULL,kOVERFLOW,kCHAR};
int status = kValid;int strToInt(const char* str)
{
/* 空指针检查 */
if (str == NULL)
{
status = kNULL;
return 0;
} /* 处理字符串前面的几个空格 */
while(isspace(*str))
str++; /* 正负号处理 */
int flag = 1;
if (*str == '-')
{
flag = -1;
str++;
}
else if (*str == '+')
str++; /* 数值操作 */
int number = 0;
while(*str != '\0')
{
if (*str >= '0' && *str <= '9')
{
number = number * 10 + *str - '0';
/* 处理overflow,int类型的范围为[-2147483648,2147483647]*/
if (number < 0)
{
if(flag == 1)
number = std::numeric_limits<int>::max();
else if (flag == -1)
number = std::numeric_limits<int>::min();
status = kOVERFLOW;
return number;
}
str++;
}
else
{
/* 处理字符串中的非数字字符,策略是返回无效字符串状态 */
status = kCHAR;
break;
}
}
return number * flag;
}int main()
{
char str[80];
cout << "请输入字符串:" <<endl;
cin.getline(str,80);
int result = strToInt(str);
switch(status){
case kValid:
cout << "字符串" << str << "对应的整数是:" << result <<endl;
break;
case kNULL:
cout << "空指针错误" <<endl;
break;
case kCHAR:
cout << "输入的字符串中有非数字字符" <<endl;
cout << result <<endl;
break;
case kOVERFLOW:
cout << "输入的字符串对应的数字使得Int类型溢出" <<endl;
cout << result <<endl;
}
return 0;
}
相关文章推荐
- 一道经典面试题“I love china”的实现
- 经典面试题:求数组的最大子序列和;实现函数 :判断一个自负喜欢是否是另一个字符串旋转所得;杨氏矩阵中查找一个数。
- 【面试题】剑指Offer-49-模拟实现atoi()函数
- [面试] 经典面试题 atoi 的实现
- 经典面试编程题--atoi()函数的实现(就是模拟手算,核心代码就一句total = 10 * total + (c - '0'); 但是要注意正负号、溢出等问题)
- 一道经典面试题“I love china”的实现
- LeetCode上一道经典的面试题-O(1)实现LRU Cache
- 一道经典面试题“I love china”的实现
- 一道经典面试题“I love china”的实现
- [笔记]一道C语言面试题:实现 itoa() 函数
- 实现sqrt函数功能,之前也是常见的面试题,本文两种解法,二分法,牛顿迭代法
- 面试题strtoi实现(一)—— 函数的简单实现
- 题目:模拟实现atoi(字符串转换为整数)函数,比如“12345”转换后就是12345。
- atoi()函数的实现
- atol(atoi)函数的实现要点
- 许多大公司的经典面试题,多线程同步之读写者的两种实现。
- 一道经典的关于Fibonacci数列的面试题(问题)的新想法 -> N阶楼梯问题
- 经典算法学习——求次方函数实现
- 一道经典的面试题:如何从N个数中选出最大(小)的n个数?
- 【经典面试题】实现平方根函数sqrt