2016-11-06 15 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

@ 엘리사 도프 :'string s;은 어떻게 초기화되지 않습니까? – IInspectable

답변

0

마지막 루프에서는 i을 부호없는 것으로 선언합니다. 따라서 i은 항상 >= 0이되어 루프가 종료되지 않습니다.

대신 i은 매우 큰 숫자로 랩 어라운드하여 충돌을 일으 킵니다. i을 서명으로 변경하십시오.

+0

코드는 * 정의되지 않은 동작 *을 표시하고 컴파일러/플랫폼은 ** 모든 ** 관찰 가능한 동작 (전혀 포함하지 않음)을 표시 할 수 있습니다. 예외가 발생하는 것은 보장되지 않으며 던져지면 C++ 예외가 아닙니다. 그러나 더 많은 가능성이 있지만 침묵하는 힙 손상입니다. – IInspectable

관련 문제