2016-09-13 6 views
-2

こんにちは私は単純な逆整数演算をC++で試しています。以下のコード:逆整数キャッチオーバーフローC++

#include <iostream> 
#include <algorithm> 
#include <climits> 

using namespace std; 

class RevInteger { 

public: 
    int reverse(int x) 
    { 
     int result = 0; 
     bool isNeg = x > 0 ? false : true; 
     x = abs(x); 

     while (x != 0) 
     { 
      result = result * 10 + x % 10; 
      x = x/10; 
     } 

     if (isNeg) 
      result *= -1; 

     if (result > INT_MAX || result < INT_MIN) 
      return 0; 
     else 
      return (int)result; 
    } 
}; 

私は1534236469として入力します。私はそれが私にいくつかの迷惑な値を返す代わりに、私に0を返すようにしたい。私のプログラムで何が間違っていますか。また、私は目的のためにclimits libを使用しようとしています、同じことを行う簡単な方法はありますか?

+3

私はあなたが求めているものは不明であるかと思います。あなたは "_reverse_"によって何を意味しましたか? '0'は' 1534236469'の逆ではありません。あなたのインプットとアウトプットの関係はどうしたいですか? –

+0

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低でも、あなたはあなたが行った観察と一緒に、[編集]あなたの質問あなたの問題を再現[、最小完全、かつ検証](http://stackoverflow.com/help/mcve)の例を含むようにする必要があります\しますデバッガ。 –

+1

'result'は' int'です。 'INT_MAX'よりも大きくても、' INT_MIN'よりも小さくなることはありません。 –

答えて

1

最も簡単な方法は、結果をintの代わりにlong longを使用することで、最後にオーバーフローをチェックしてください。

long long result = 0; 
/* the rest of your code */ 
return (int)result; // Now the cast is necessary; in your code you could do without it 

別のアプローチは、文字列にintを変換し、それを逆にして、使用することですあなたは、整数内にとどまる必要がある場合は、アプローチはintermをチェックすることです

int rev(int n) { 
    auto s = to_string(n); 
    reverse(s.begin(), s.end()); 
    try { 
     return stoi(s); 
    } catch (...) { 
     return 0; 
    } 
} 

:戻ってそれを変換してみてください、そして道(demo)に沿って問題をキャッチする標準ライブラリediate結果10を乗じ、また、添加後、オーバーフローをチェックする前に:

while (x != 0) { 
    if (result > INT_MAX/10) { 
     return 0; 
    } 
    result = result * 10 + x % 10; 
    if (result < 0) { 
     return 0; 
    } 
    x = x/10; 
} 
+0

@dasblinkenlight長い長い作品。しかし、VS2015で警告C4244がスローされます。 '引数': '__int64'から 'int'への変換、データ損失の可能性あり –

+0

@ArunavaNag値がINT_MAX以下であることを確認した後、警告が表示されます。 – dasblinkenlight

0

@daskblinkenlightによって示唆されるように。結果を長く変更し、最後に型キャストすると問題が解決します。

ワーキングクラス:

class intReverse { 

public: 
int reverse(int x) { 

    long long result = 0; // only change here 
    bool isNeg = x > 0 ? false : true; 
    x = abs(x); 
    while (x != 0) { 
     result = result * 10 + x % 10; 
     x = x/10; 
    } 
    if (isNeg) { 
     result *= -1; 
    } 
    if (result > INT_MAX || result < INT_MIN) 
    { 
     return 0; 
    } 
    else 
    { 
     return (int) result; 
    } 

    } 
};