字符串轉成整數的核心代碼很簡單,可是須要考慮的各類狀況不少。ios
一、首位+、-的判斷。git
二、在+、-的溢出判斷。函數
三、NULL、空字符串的判斷。spa
四、數字後面出現了不少非數字的狀況。atoi函數是講前面的數字保存下來,《劍指offer》的代碼則是返回0。兩種狀況都說的通,視狀況而定吧。code
五、開頭出現了不少非數字,中間摻雜着數字的出現,直接返回0。blog
#include <iostream> using namespace std; enum{ kValid=0, kInvalid }; int status=kValid; long StrToIntCore(const char* digit, bool minus) { long num=0; while(*digit!='\0') { if (*digit>='0'&&*digit<='9') { int flag=minus?-1:1; num=num*10+flag*(*digit-'0'); if (!minus&&num>0x7FFFFFFF||minus&&num<(signed int)0x80000000) { num=0; break; } digit++; } else { break; } } if (*digit=='\0') { status=kValid; } return num; } int StrToInt(const char* str) { status=kInvalid; long num=0; if (str!=NULL&&*str!='\0') { bool minus=false; if (*str=='+') { str++; } else if(*str=='-') { str++; minus=true; } if (*str!='\0') { num=StrToIntCore(str,minus); } } return num; } int main() { char str[100]; while(cin>>str){ cout<<StrToInt(str)<<endl; cout<<atoi(str)<<endl; } return 0; }