2016-11-06 57 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爲unsigned。因此i將始終爲>= 0,並且您的循環不會終止。

取而代之的是,i將環繞到一個非常大的數字,從而導致崩潰。只需更改i即可簽名。

+0

可能值得指出的是,代碼展現*未定義的行爲*,並且編譯器/平臺可以自由顯示**任何**可觀察行爲(包括非所有行爲)。不能保證發生異常,如果拋出異常,肯定不是C++異常。然而,更有可能的是沉默的堆腐敗。 – IInspectable