2014-07-20 12 views
9

Sto tentando di immettere un numero, n e ottenere il numero super-fortunato che è maggiore o uguale a n. Super fortunato: la sua rappresentazione decimale contiene la stessa quantità di cifre 4 e 7. Ad esempio, i numeri 47, 7744, 474477 sono super fortunati e 4, 744, 467 non lo sono.Errore di debug -Abort() è stato chiamato

Ecco il mio codice

 #include<iostream> 
    #include<string> 
    using namespace std; 

    void superLucky(int n,string s, int count4, int count7) 
    { 
     if (s.size() > 10) 
      return; 
     if ((stoi(s) >= n) && (count4 == count7) && (count4+count7)!=0) 
     { 
      cout << s << endl; 
      return; 
     } 

     superLucky(n, s + '4', count4+1, count7); 
     superLucky(n, s + '7',count4,count7+1); 
    } 

    int main() 
    { 
     int n; 
     cin >> n; 
     superLucky(n, "", 0, 0); 
     return 0; 
    } 

Una volta ho ingresso qualche intero ottengo l'errore di debug R6010 - abort() è stato chiamato. Cosa significa ? e come posso risolvere questo?

+0

Significa ciò che dice; la funzione 'abort' è stata chiamata. Allegare un debugger e vedere dove è stato chiamato. –

+0

Si chiama al secondo se condizione – MNada

risposta

4

Ci sono un paio di questioni:

  1. Quando si chiama superLucky da main, s è vuota. stoi(s) genera un'eccezione quando s è vuoto.

  2. Il controllo s.size() > 10 non è robusto. Dipende dalla piattaforma. È possibile utilizzare un blocco try/catch per gestirlo invece di codificare in modo rigido una dimensione.

Ecco una versione più robusta della funzione.

void superLucky(int n,string s, int count4, int count7) 
{ 
    int d = 0; 
    if (s.size() > 0) 
    { 
     try 
     { 
     d = stoi(s); 
     } 
     catch (...) 
     { 
     return; 
     } 

     if ((d >= n) && (count4 == count7) && (count4+count7)!=0) 
     { 
     cout << s << endl; 
     return; 
     } 
    } 

    superLucky(n, s + '7',count4,count7+1); 
    superLucky(n, s + '4', count4+1, count7); 
} 
+0

Ora funziona bene. grazie). – MNada

+0

@ User3697826, siete i benvenuti. –

0

Probabilmente perché stoi() ha generato un'eccezione invalid_argument.

0

Alla prima chiamata a superLucky, si passa una stringa vuota a std::stoi. Se non è possibile eseguire la conversione, stoi genera un'eccezione. Tale eccezione non viene rilevata, in modo uncaught_exception viene chiamato, che a sua volta chiama abort