2009-08-07 16 views
1

Unten ist meine Funktion. Ich nenne es mitWarum funktioniert diese Konvertierung nicht?

if(try_strtol(v, rhs)) 

und RHS = "15 \ t // Kommentar"

bool try_strtol(int64_t &v, const string& s) 
{ 
    try 
    { 
     std::stringstream ss(s); 
     if ((ss >> v).fail() || !(ss >> std::ws).eof()) 
      throw std::bad_cast(); 
     return true; 
    } 
    catch(...) 
    { 
     return false; 
    } 
} 

Es gibt false zurück, i Ausnahme gilt mit v = 15. Wie behebe ich das?

+0

Warum erwarten Sie, dass es wieder wahr wird? Was erwarten Sie?! (Ss >> std :: ws) .eof() 'zu bewerten? oder '(s >> v) .fail()' in dieser Angelegenheit? –

+3

Schritt 1: Hör auf, clever zu sein. Zerlege den Ausdruck so, dass er lesbar ist, du machst niemanden zufrieden. Vor allem du selbst. Sobald Sie es mit einer Reihe von Komponententests arbeiten, dann versuchen Sie Ihren kleinen Optimierungstrick, um zu sehen, ob es noch funktioniert. –

+1

Eigentlich habe ich diesen Martin geschrieben. http://stackoverflow.com/questions/1243428/convert-string-to-int-with-bool-fail-in-c/1243435#1243435 – GManNickG

Antwort

2

Wenn Sie es wollen, einen boolean zurück, tun gerade dies:

bool try_strtol(int64_t &v, const string& s) 
{ 
    std::stringstream ss(s); 
    return (ss >> v).fail() || !(ss >> std::ws).eof(); 
} 

Und es scheitern, weil es eine schlechte Besetzung ist. Hatten Sie gehofft, dass der Kommentar ignoriert würde?

+0

Ja: D. Mein Strom Wissen ist schlecht und ich bin in der Mitte der Hausaufgaben, die in 2 Stunden fällig sind (ich habe 4 Stunden, es zu tun, ich war abwesend). Ich frage eher, wie man ein int richtig umsetzt und dann selbst eine schlechte Version schreibt. –

+0

oops, ich habe gestern den Post nicht erklärt. Ich begann damit, bevor ich ins Bett ging. Ich bin vor 1 Stunde aufgewacht. –

+0

oh und nochmals danke für beide Antworten: D –

4

Warum erwarten Sie, dass (ss >> std::ws).eof() wahr ist? rhs enthält Nicht-Leerzeichen nach 15, so dass die if-Bedingung wahr ist und die Ausnahme ausgelöst wird, weshalb sie false zurückgibt.

3

Nach std :: ws überspringt die Registerkarte, Sie sind noch nicht auf eof.

+0

das habe ich komplett vermisst. Ich habe Streams nicht genug verstanden und hetzte –

0

Wenn Sie erwarten, dass Stream IO C++ - Kommentar als Leerraum behandelt, ist das nicht der Fall.

Verwandte Themen