文章目录

//不用atoi,实现字符串转数字 //考虑边界:字符串NULL,正负号,int 型最大0x7fffffff,负数最小0x80000000
//区分“0”的输出结果和无效字符串的输出

#include <iostream>

using namespace std;
enum Status {kValid=0, kInvalid};
int g_nStatus=kValid;//输出状态
long long StrToIntCore(const char* str, bool minuss){
    long long num=0;
    while(*str!='\0'){
        if(*str>='0' && *str<='9'){//有效数字
            int flag=minuss?-1:1;
            num=num*10+flag*(*str-'0');

            if((!minuss && num>0x7fffffff)||(minuss && num<(signed int)0x80000000)){//超过long long表示范围,注意signed int
                num=0;
                break;
            }
            str++;
        }
        else{//非法输入
            num=0;
            break;
        }
    }
    if(*str=='\0')//字符串为空
    {
        g_nStatus=kValid;
    }
    return num;
}
int StrToInt(const char* str){
    g_nStatus=kInvalid;
    long long num=0;

    if(str!=NULL && *str !='\0'){
        bool minuss=false;//正负号
        if(*str=='+')
            str++;
        else if(*str=='-'){
            str++;
            minuss=true;
        }
        if(*str!='\0'){
            num=StrToIntCore(str,minuss);
        }
    }
    return (int)num;
}
int main()
{
    cout << StrToInt("-123") << endl;
    cout << StrToInt("+123") << endl;
    cout << StrToInt("0") << endl;
    cout << StrToInt("") << endl;
    return 0;
}
文章目录