字符串转整数
描述
请你来实现一个 atoi 函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
说明:
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−2^31, 2^31 − 1]。如果数值超过这个范围,请返回 INT_MAX (2^31 − 1) 或 INT_MIN (−2^31) 。
输入
字符串,长度不超过100
输出
整数
输入样例 1
42
输出样例 1
42
输入样例 2
-42
输出样例 2
-42
输入样例 3
words and 987
输出样例 3
0
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
const long long M=pow(2,31);
int main(){
string a,b; //4294967295
long long sum=0;
getline(cin,a);
long long i=0,j=0,flag=1;
while(a[i]!='\0'&&a[i]==' ') i++;//寻找第一个字符的位置
if((a[i]>='0'&&a[i]<='9')||(a[i]=='+'||a[i]=='-')){
if(a[i]=='-'){ i++; flag=-1;}
if(a[i]=='+') i++;
while(a[i]){
if(a[i]>='0'&&a[i]<='9')
b=b+a[i]; //得出该数值,存放在字符串里
else break;
i++;
}
int len=0; //考虑前导零的影响
while(b[len]=='0'){
len++;
}
if((b.length()-len)<=10){
while(b[j]){
sum=sum*10+b[j]-'0';
j++;
}
if(flag==-1){
if(sum<=M)
cout<<flag*sum;
else{
cout<<flag*M;
}
}
else{
if(sum<=(M-1))
cout<<sum;
else{
cout<<M-1;
}
}
}
else{
if(flag==-1)
cout<<flag*M;
else
cout<<M-1;
}
}
else
cout<<0;
return 0;
}