写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
说明:
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
示例 1:
代码语言:javascript复制输入: "42"
输出: 42
代码语言:javascript复制class Solution {
public:
int myAtoi(string s) {
//特殊处理,空字符串
if(s.empty()) return 0;
long long ans=0;
int n=0;
while(s[n]==' ')n ;
//取出字符串开头多余空格
s=s.substr(n);
int postFlag=0;
int negFlag=0;
int numFlag=0;
for(int i=0;i<s.size();i ){
//负数处理,第一次出现
if(s[i]=='-'){
if(negFlag==0&&postFlag==0&&numFlag==0)
{
negFlag=1;continue;
}else break;
}
//正数处理,第一次出现
if(s[i]==' '){
if(negFlag==0&&postFlag==0&&numFlag==0)
{
postFlag=1;continue;
}else break;
}
if(isdigit(s[i])){
if(ans>INT_MAX)break;
ans=ans*10 (s[i]-'0');
numFlag=1;
}else break;
}
if(negFlag==1)ans=-ans;
ans=max(ans,(long long )INT_MIN);
ans=min(ans,(long long )INT_MAX);
return ans;
}
};
代码语言:javascript复制#include <stdio.h>
#include <iostream>
using namespace std;
#include <climits>
int strToInt(string str);
int main(void) {
int x=2;
//0x004013be < 14>: mov DWORD PTR [esp 0x18],0x2
//0x004013c6 < 22>: lea eax,[esp 0x18]
//0x004013ca < 26>: mov DWORD PTR [esp 0x1c],eax
//0x004013ce < 30>: mov eax,DWORD PTR [esp 0x1c]
//0x004013d2 < 34>: mov eax,DWORD PTR [eax]
// 0x004013d4 < 36>: mov DWORD PTR [esp 0x8],eax
// 0x004013d8 < 40>: mov eax,DWORD PTR [esp 0x1c]
//0x004013dc < 44>: mov DWORD PTR [esp 0x4],eax
//0x004013e0 < 48>: mov DWORD PTR [esp],0x403064
// 0x004013e7 < 55>: call 0x401cc0 <printf>
int *p=&x;
printf("地址=%d 数值= %dn",p,*(p));
int arr[5]={10,2,30,4,5};
int *pt=arr;
cout<<*pt<<endl;
cout<<"* pt"<<* pt<<endl;
//cout<<" *pt"<< *pt<<endl;
cout<<"*pt "<<*(pt )<<endl;
cout<<*pt<<endl;
printf("char size = %dn", sizeof(char));
printf("short size = %dn", sizeof(short));
printf("int size = %dn", sizeof(int));
printf("long size = %dn", sizeof(long int));
printf("long long size = %dn", sizeof(long long));
printf("float size = %dn", sizeof(float));
printf("double size = %dn", sizeof(double));
printf("long double size = %dn", sizeof(long double));
int n=0;
//int m=strToInt(" 4193 with words");-91283472332
int m=strToInt(" 91283472332 with words");//1089159116 91283472332
cout<<m<<"ge";
return 0;
}
int strToInt(string str) {
if(str.empty())return 0;
int n=0;
while(str[n]==' ')n ;
int negtive=0;
int postive=0;
int numFlag=0;
str=str.substr(n);
int ans=0;
for(int i=0;i<str.size();i ){
cout<<str[i];
if(str[i]=='-'){
if(negtive==0&&postive==0&&numFlag==0){
negtive=1;continue;
}else break;
}
if(str[i]==' '){
if(negtive==0&&postive==0&&numFlag==0){
postive=1;continue;
}else break;
}
if(isdigit(str[i])){
//这个地方结果可能大于最大值
ans=ans*10 str[i]-'0';
}
}
if(negtive==1)ans=-ans;
if(ans>INT_MAX){
return INT_MAX;
}
if(ans<INT_MIN){
return INT_MIN;
}
return ans;
}