//============================================================================
// Name : myAtio.cpp
// Author : forever_yu
// Version : V1.0
// Copyright : 如果转载请注明出处!!!
// Description : 把字符串转换成整数 in C++, Ansi-style
// 1.考虑是否有符号 2.输入的string是否合法,即除了符号外不存在其他字符
// 3.考察转换之后的数是否越界 4.在最大界和最小界处做特殊处理 5.数字是否存在空格
//============================================================================
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
using namespace std;
bool InvalidFlag=false;
bool OverFlow=false;
int myAtoi(const char *);
int main() {
char string[]=" -2147483649";
cout<<myAtoi(string)<<endl;
return 0;
}
int myAtoi(const char *string){
//返回-1并且在InvalidFalg==true时代表非法输入
//当OverFlow==true时标识输入的数溢出最大范围
if(string==NULL){
cerr<<"string is empty!!!Please check the input string..."<<endl;
return -1;
}
int nLength=strlen(string);
bool hasSymbol=false;
int numStart=0;
while(numStart<nLength-1 && ' '==string[numStart]){
//如果存在空格,处理前边的空格
++numStart;
}
if(('+'!=string[numStart] && '-'!=string[numStart]) && ('9'<string[numStart] || '0'>string[numStart])){
//第一个字符不是'+'并且不是'-'。或者string[0]不是数字
InvalidFlag=true;
cerr<<"Invalid Input!!!"<<endl;
return -1;
}
char symbol=' ';
if('+'==string[numStart] || '-'==string[numStart]){
hasSymbol=true;
symbol=string[numStart];
++numStart;
}
if(hasSymbol&&nLength==numStart){
InvalidFlag=true;
cerr<<"Invalid Input!!!Only has symbol..."<<endl;
return -1;
}
unsigned int result=0;
unsigned int MaxInt = INT_MAX; //获得int类型的最大值
for(;numStart<nLength;++numStart){
if('9'>=string[numStart]&&'0'<=string[numStart]){
//该部分需要检测result是否越界...
if(((unsigned)result*10+(unsigned)(string[numStart]-'0'))>MaxInt){
if(hasSymbol==true && '-'==symbol &&
((unsigned)result*10+(unsigned)(string[numStart]-'0'))==(MaxInt+1)){
//当输入的整数值INT_MIN时做特殊处理
result=result*10+(string[numStart]-'0');
}else{
InvalidFlag=true;
OverFlow=true;
cerr<<"Invalid Input!!!OverFlow!!!"<<endl;
return -1;
}
}else{
result=result*10+(string[numStart]-'0');
}
}else{
InvalidFlag=true;
cerr<<"Invalid Input!!!has char in the stringInput!!!"<<endl;
return -1;
}
}
if(hasSymbol&&'-'==symbol){
result=-result;
}
return result;
}
字符串string转整数int 实现自己的atoi函数
最新推荐文章于 2022-05-17 23:08:22 发布