题目
输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串”345”,则输出整数345。
分析
这道题尽管不是很难,学过 C/C++语言一般都能实现基本功能,但不同程序员就这道题写出的代码有很大区别,可以说这道题能够很好地反应出程序员的思维和编程习惯,因此已经被包括微软在内的多家公司用作面试题。建议读者在往下看之前自己先编写代码,再比较自己写的代码和下面的参考代码有哪些不同。
我们需要考虑一下几个方面的问题:
(1)正负问题:
由于整数可能不仅仅之含有数字,还有可能以’+’或者’-‘开头,表示整数的正负。因此我们需要把这个字符串的第一个字符做特殊处理。
如果第一个字符是’+’号,则不需要做任何操作;
如果第一个字符是’-‘号,则表明这个整数是个负数,在最后的时候我们要把得到的数值变成负数。
(2)非法字符问题:
输入的字符串中可能含有不是数字的字符 。每当碰到这些非法的字符 ,我们就没有必要再继续转换 。
(3)溢出问题:
由于输入的数字是以字符串的形式输入,因此有可能输入一个很大的数字转换之后会超过能够表示的最大的整数而溢出。
代码
/*--------------------------------------------- * 日期:2015-02-11 * 作者:SJF0115 * 题目: 17.把字符串转换成整数 * 来源:程序员精选100题 * 博客: -----------------------------------------------*/
#include <iostream>
#include <climits>
using namespace std;
class Solution {
public:
bool StrToInt(string str,int& num){
int size = str.size();
if(size <= 0){
return false;
}//if
// 正负
int index = 0;
bool positive = true;
if(str[index] == '-'){
positive = false;
++index;
}//if
else if(str[index] == '+'){
++index;
}//else
long long result = 0;
for(int i = index;i < size;++i){
// 判断是否是非法字符
if(str[i] < '0' || str[i] > '9'){
cout<<"非法字符"<<endl;
return false;
}//if
result = result * 10 + str[i] - '0';
// 判断是否溢出
if(result > INT_MAX){
cout<<"溢出"<<endl;
return false;
}//if
}//for
num = positive == false ? (-1 * result) : result;
return true;
}
};
int main() {
Solution solution;
string str("-122222222222222");
int num = 0;
if(solution.StrToInt(str,num)){
cout<<num<<endl;
}//if
else{
cout<<"转换有问题"<<endl;
}
}