文字列を整数1に変換

4711 ワード

最初にこの問題を見たとき、すべての文字を整数に変換した後に加算するか、文字列の数値文字を変換するかという疑問が生じました.数値文字のみを変換する場合、どのフォーマットの数値文字が合法ですか?文字列を整数に変換するという一言しか与えられないので、考えてみましょう.ここでは、1つの文字列を整数に変換し、文字列に他の文字が含まれる可能性がありますが、文字列の先頭に合法的な数値文字のみを変換します.例えば、-123 abc 4、変換結果は-123である.文字列を使用して整数を回転できないライブラリ関数が必要です.問題を解く構想:まず、テスト例を書きます.
int main(){
    long long result;
    string str = "-123456789char";
    result = strToInt(str);  //  
    if(valid)  //    ,             
        cout << "Result is: " << result ;
    else
        cout << "Integer string is not valid!";

    return 0;
} 
Output:  -123456789

この問題で考慮すべきいくつかの側面:
  • 入力が空
  • プラスマイナス
  • 数字以外の文字
  • オーバーフロー問題
  • 関数の開発過程は以下の通りである:1.必要な変数の定義
    //    ,        ,      
    bool valid = false;
    
    long long strToInt(string &str){
        //      
        long long res = 0;
        //    
        bool minus = false;
        //string   
        string::iterator iterBeg = str.begin();
    }

    2.コアコードは、数字にプラスマイナス記号がある可能性があることを考慮して判断する.プラスとマイナスの記号がある場合は、反復器を1文字前進させます.後の文字が数字でない場合はそのまま終了し、数値である場合は数式を使用して整数に変換します.たとえば、最初の数値文字が2、result=2、次に2番目の数値文字3にスキャンすると、resultは23に等しいはずです.このとき、result=result*10+3、すなわち2*10+3=23です.3番目の数字4にスキャンします.result=result*10+4、すなわち23*10+4=234です.順番に類推し、末尾または数値以外の文字に遭遇するまでループを終了します.算出結果についてオーバーフローがあるか否かを判断する、オーバーフローがある場合は結果を0とする.
    //        
        if(*iterBeg != NULL){
            //     
            if(*iterBeg == '+')
                ++iterBeg;
            else if(*iterBeg == '-'){
                minus = true;
                ++iterBeg;
            }
            while(*iterBeg != NULL){  //                 
                if(*iterBeg >= '0' && *iterBeg <= '9'){
                    valid = true;
                    res = res * 10 + *iterBeg - '0';  //    
                    //    
                    if(res > INT_MAX){  //  
                        cout << "Over flow
    "
    ; res = 0; break; // 0, } ++iterBeg; }else{ // 0-9 , break; } } if(minus) // res = 0 - res; if(res < INT_MIN){ // cout << "Under flow
    "
    ; res = 0; } } return res;

    注意すべき点:C++ではstring文字列にNULLを割り当てることはできません.