「ソードフィンガーオファー」第67問:文字列を整数に変換

// インタビューの質問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、マイナス);
    }
    returnint )num;
}

long  long StrToIntCore(const  char *数字、ブールマイナス)
{
    long  long num = 0 ;

    while(*数字!= ' \ 0 ' 
    {
        if(*桁> = ' 0 ' && *桁<= ' 9 ' 
        {
            intフラグ=マイナス?- 11 ;
            NUM = NUM * 10 +フラグ*(*桁- ' 0 ' )。

            if((!minus && num> 0x7FFFFFFF// 溢出 
                ||(minus && num <(signed int0x80000000 ))
            {
                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、現在、マイナス);
        }
        returnint )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フラグ=マイナス?- 11 ;
                num = num * 10 + flag *(digit [i]- ' 0 ' );
                
                if((!minus && num> 0x7FFFFFFF  ||(minus && num <(signed int0x80000000 ))
                {
                    num = 0 ;
                    休憩;
                }
            }
            そうしないと
            {
                num = 0 ;
                休憩;
            }
        }
        
        if(i == length)
            g_nStatus = kValid;
        
        numを返します。
    }
};
Niuke提出コード

 

おすすめ

転載: www.cnblogs.com/ZSY-blog/p/12699071.html