- 方法一:使用C函数库中的函数atoi(const char *nptr),一行代码就可以解决问题,但这并不是题目所需要的解题思路;
- 方法二:假如我们输入的是“345”,从左到右依次遍历,第一次所要的结果是“3”,第二次所要的结果是“34”,34=3*10+4,第三次所要的结果是“345”,345=34*10+5。由此,我们可以从左到右依次遍历每一个字符,将前一次得到的结果*10+本次遍历的字符,使用一个循环就可以将一个字符串转化成一个整数。
- 如果字符串中的第一个字符是“-”,那么得到的是负整数。因此,需要先判断第一个字符是不是“-”,如果是,则将最后的结果乘以-1即可;
- 如果有非法输入,即字符串中有不在”0”~”9”之间的字符。如果碰到非法输入的字符,则直接退出转化的操作,同时返回一个布尔型的值0(输入的字符串也可能是0,为了区分,也可以单独打印一条提示语句)。
- 如果输入的字符串很长,则可能溢出。如果是正数溢出,则大于最大的整数,如果是负数溢出,则小于最小的整数。使用
if((result > numeric_limits<int>::max() && !isNegative) || (result < numeric_limits<int>::min() && isNegative))
来判断。溢出后也直接退出转化的操作。
#include <iostream>
#include <string>
#include <limits>
using namespace std;
bool validInput = false;//表示是非法输入
int strToInt(const char *str){
//bool invalid
bool isNegative = false;//用于判断是否是负数的标志
long result = 0;//用于保存最后的结果
const char *digit = str;
if(digit != NULL){
if(*digit == ‘+‘){//判断是否是正数
//isNegative = false;//不需要重新赋值
digit++;
}
else if(*digit == ‘-‘){//判断是否是负数
isNegative = true;
digit++;
}
while(*digit !=‘\0‘){
if(*digit >=‘0‘ && *digit <=‘9‘){
result = result*10 + (*digit -‘0‘);//得到一个数字
if((result > numeric_limits<int>::max() && !isNegative) || (result < numeric_limits<int>::min() && isNegative)){
result = 0;//溢出后的处理
break;
}
digit++;
}
else{//遇到非法字符,停止计算,直接退出
result = 0;
break;
}
}
if(*digit == ‘\0‘){//如果到达最后一个字符时,则是有效输入。
validInput = true;
if(isNegative){
result =(-1)*result;//or result =0-result
}
}
}
return result;
}
int main(void){
cout<<"Enter a string:"<<endl;
char *mystring = new char[100];
cin>>mystring;
cout<<"After Convert,the result is :"<<endl;
cout<<strToInt(mystring)<<endl;
cout<<"The status of the string is "<<validInput<<endl;
delete[] mystring;//释放内存空间
system("pause");
return 0;
}