2016-11-06 14 views
-1

"n"とその基数 "D"が指定された場合、その後に続く関数を使用して基数Dで逆数を計算し、Decimalに変換して返します。例外がC++関数で発生しました

問題は、方法1は成功裏に機能し、方法2は常に例外が発生することです。方法2の問題点は何ですか?どうもありがとう。

int getrevn(int n, int D) 

{ 
//-------method 1-------------------------// 

    int revn = 0; 
    while (n) 
    { 
     revn = revn * D + n % D; 
     n /= D; 
    } 
    return revn; 

//------method 2-------------------------// 

    string s; 
    while (n) 
    { 
     s = char(n % D + '0') + s; 
     n /= D; 
    } 
    int rev = 0; 
    for (unsigned int i = s.size() - 1; i >= 0; i--) 
     rev = rev * D + s[i] - '0'; 
    return rev; 
} 
+1

どういう例外がありますか?それは重要なことです。 – Carcigenicate

+1

メソッド2では 's'は宣言されましたが、初期化されていないので' + s'はできません。 –

+0

@EliSadoff: 'string s;はどのように初期化されていませんか? – IInspectable

答えて

0

最後のループでは、iを符号なしとして宣言しています。したがってiは常に>= 0になり、ループは終了しません。

代わりに、iは非常に大きな数値にラップアラウンドするため、クラッシュが発生します。 iを署名するだけに変更してください。

+0

コードは*未定義の動作*を示し、コンパイラ/プラットフォームは任意の**観察可能な動作を表示することが自由であることを指摘する価値はあります。例外が発生することは保証されておらず、スローされた場合はC++の例外ではありません。しかし、より多くの可能性があるのは、サイレントヒープ破損です。 – IInspectable

関連する問題