// インタビューの質問67:文字列を整数に変換します // 質問:文字列を整数に変換する機能を実現するために、関数StrToIntを記述してください。もちろん、ない //はATOIまたは他の同様のライブラリ関数を使用することができます。 #include <cstdio> long long StrToIntCore(const char * str、bool マイナス); 列挙型ステータス{kValid = 0 、kInvalid}; int g_nStatus = kValid; int StrToInt(const char * str) { long long num = 0 ; g_nStatus = kInvalid; if(str!= nullptr && * str!= ' \ 0 ') // 文字列をnullポインタとして処理するか、 "" { boolマイナス= false ; // 負符号 if(* str == ' + ' ) ++ str; それ以外の 場合(* str == ' - ' ) { ++ str; マイナス = 真; } if(* str!= ' \ 0 ') // 単一シンボルの問題を処理する num = StrToIntCore(str、マイナス); } return(int )num; } long long StrToIntCore(const char *数字、ブールマイナス) { long long num = 0 ; while(*数字!= ' \ 0 ' ) { if(*桁> = ' 0 ' && *桁<= ' 9 ' ) { intフラグ=マイナス?- 1:1 ; NUM = NUM * 10 +フラグ*(*桁- ' 0 ' )。 if((!minus && num> 0x7FFFFFFF) // 溢出 ||(minus && num <(signed int)0x80000000 )) { num = 0 ; 休憩; } ++ 桁; } else // 無効な文字列 { num = 0 ; 休憩; } } if(* digit == ' \ 0 ' ) g_nStatus = kValid; numを返します。 }
// ====================テストコード==================== voidテスト(const char * 文字列) { int result = StrToInt(string ); if(result == 0 && g_nStatus == kInvalid) printf(" 入力%sは無効です。\ n "、文字列); else printf(" %sの数は%dです。\ n "、文字列、結果); } int main(int argc、char * argv []) { テスト(nullptr); Test("" ); Test(" 123 " ); Test(" +123 " ); Test(" -123 " ); Test(" 1a33 " ); Test(" +0 " ); Test(" -0 " ); // 有効な最大の正の整数、0x7FFFFFFF テスト(" +2147483647 " ); Test(" -2147483647 " ); Test(" +2147483648 " ); // 有効な最小の負の整数、0x80000000 テスト(" -2147483648 " ); Test(" +2147483649 " ); Test(" -2147483649 " ); Test(" + " ); Test(" - " ); 0を返します。 }
分析:さまざまな偶発的な入力を検討します。
クラスSolution { public : enum Status {kValid = 0 、kInvalid}; int g_nStatus = kValid; int StrToInt(string str){ long long num = 0 ; g_nStatus = kInvalid; int length = str.length(); if(!str.empty()) { int current = 0 ; ブールマイナス= false ; if(str [current] == ' + ' ) ++ 現在; else if(str [current] == ' - ' ) { ++ 現在; マイナス = 真; } if(現在の!= 長さ) num = StrToInt(str、現在、マイナス); } return(int )num; } long long StrToInt(string digit、int current、bool マイナス) { long long num = 0 ; int length = digit.length(); int i = 0 ; for(i = current; i <length; ++ i) { if(digit [i] <= ' 9 ' && digit [i]> = ' 0 ' ) { intフラグ=マイナス?- 1:1 ; num = num * 10 + flag *(digit [i]- ' 0 ' ); if((!minus && num> 0x7FFFFFFF ) ||(minus && num <(signed int)0x80000000 )) { num = 0 ; 休憩; } } そうしないと { num = 0 ; 休憩; } } if(i == length) g_nStatus = kValid; numを返します。 } };