2017-10-24 3 views
1

Ich bin neu in C++ und wahrscheinlich fehlt etwas offensichtlich. Ich möchte OCT- und HEX-Nummern mit DEC in Verbindung bringen. Ich kann alle Arten von falschen Eingaben bekommen, also wollte ich anstelle vieler Bedingungen die Konvertierung mit std :: stoul machen und fangen, wenn es nicht funktioniert.Std :: stoul nicht nach Caching in C++ gefangen

Der Punkt der Methode besteht darin, 3 Zahlen in einer Zeichenfolge zu erhalten. Der erste ist in OCT, der zweite in DEC und der dritte in HEX. Ich muss überprüfen, ob sie den gleichen Wert haben oder nicht.

Ich bekomme die Zahlen von einem Vektor Vec von Strings, aber das funktioniert gut und ich glaube nicht, das Problem ist da.

Problem ist, dass immer wenn die Methode fehlschlägt (zum Beispiel "88" für OCT) der gesamte Test fehlschlägt und es nicht in den catch-Block geht.

Dies ist mein Code:

bool validate_line(const std::string& str) { 
    std::vector<std::string> vec; 
    std::string tmp; 

    for (int i = 0; i < str.size(); i++){ 
     if(str.at(i) == ' '){ 
      vec.push_back(tmp); 
      tmp = ""; 
     } 
     else { 
      tmp += str.at(i); 
      if(i + 1 == str.size()) vec.push_back(tmp); 
     } 
    } 
    if(vec.size() != 3) return false; 

    //1 - Octan number 
    unsigned long octDec; 
    try { 
     octDec = std::stoul(vec.at(1), nullptr, 8); 
    } 
    catch(const std::invalid_argument& ia){ 
     return false; 
    } 

    //2 - Decimal 
    int dec = atoi(vec.at(2).c_str()); 

    //3 - Hex number 
    std::string h = vec.at(3).c_str(); 
    unsigned long hexDec; 
    try{ 
    hexDec = std::stoul(h, nullptr, 16); 
    } 
    catch(const std::invalid_argument& ia) { 
     return false; 
    } 

    if(octDec == dec && dec == hexDec) return true; 
    return false; 
} 

Dies sind Beispiele für meine Tests für diese Methode. Der erste ist in Ordnung. Der Rest sollte in den Catch-Blöcken enden.

TEST_CASE("Line validation", "[small1]") { 

    GIVEN("complex improperly tagged equal string") { 
     CHECK(validate_line("0111 73 0x49")); 
    } 

    GIVEN("string not conforming to format -- bad number format") { 
     CHECK(!validate_line("88 88 0x58")); 
    } 

    GIVEN("string not conforming to format -- not numbers") { 
     CHECK(!validate_line("07 7 G")); 
    } 
} 
+1

die meiste Zeit ist der Fehler in dem Code, wo Sie es am wenigsten erwarten. Wie auch immer, du musst ein [mcve] bereitstellen. Woher weißt du, dass keine Exception geworfen/gefangen wird? – user463035818

+0

Ich habe eine Testmethode. Wann immer also ein Test mit einer schlechten Eingabe kommt, scheitert es an der Zeile mit std: stoul, anstatt in den catch-Block zu gehen. –

+0

Wie ich geschrieben habe, zum Beispiel für OCT, sende ich "88" ein, was nicht die Oktanzahl ist. Dann sollte es scheitern und es tut es tatsächlich, aber es ist keine Ausnahme. Oder für HEX kann ich etwas wie "2x" einsenden. So etwas versuche ich loszuwerden. –

Antwort

2

Ihr Code liefert immer auf der folgenden Zeile:

if(vec.size() != 4) return false; 

so die Funktion, die nie aufgerufen werfen kann.

Die vec.size() an diesem Punkt ist immer 3 für alle Ihre Test-Eingänge.

UPDATE:

OP geändert, um die Codezeile in Frage zu

if(vec.size() != 3) return false; 

nach dieser Antwort bereits gebucht wurde.

+0

Sorry, das war nur ein Fehler in dem Code, den ich zeigte.Es ist nicht das eigentliche Problem. Ich habe es im ursprünglichen Post korrigiert. –

+0

Bitte ändern Sie Ihre Frage nicht, nachdem es bereits eine gültige Antwort (auf die ursprüngliche Frage) gibt, oder bemerken Sie es irgendwie, dass Sie Ihre Frage geändert haben, z. ein * UPDATE: * Abschnitt – cwschmidt

0

Das Problem war tatsächlich im Compiler. Ich benutze CLion und beim Debuggen zeigt es nicht den Schritt in catch-Block, wenn es nur eine Return-Anweisung gibt. Es gibt wirklich kein Problem mit dem Code.

+0

Tomáš Zajda So können Sie meine Antwort als die akzeptierte markieren, wenn Sie möchten. – cwschmidt