string to size_t mit stringstream schlägt bei string mit negativer Zahl nicht fehl



  • Wie könnte ich es hinkriegen, das die Konvertierung fehlschlägt, wenn ein String mit negativer Zahl eingegeben wird?

    std::string inputString = "-5";
    std::stringstream ss(inputString);
    std::size_t outputValue;
    
    if(ss >> outputValue)
    {
    	std::cout << "ok\n";
    }
    


  • Nimm struol. (Wobei das wieder errno nutzt. Auch doof. Tja...)



  • popmen schrieb:

    Wie könnte ich es hinkriegen, das die Konvertierung fehlschlägt, wenn ein String mit negativer Zahl eingegeben wird?

    std::string inputString = "-5";
    std::stringstream ss(inputString);
    std::size_t outputValue;
    
    if(ss >> outputValue)
    {
    	std::cout << "ok\n";
    }
    

    Joa, schlägt nicht fehl, weil unsigned under/overflow wohl definiert ist. Wie man das nun elegant löst, weiß ich gerade auch nicht, warten wir mal, was die anderen sagen. 🙂


  • Mod

    Du könntest das erste Zeichen peek()en. Ansonsten würde ich das als Feature ansehen, nicht als Bug.



  • cooky451 schrieb:

    Nimm struolstrtoul.

    lol. Das macht genau das gleiche.

    out schrieb:

    Joa, schlägt nicht fehl, weil unsigned under/overflow wohl definiert ist.

    👍 Genau so läuft das.

    SeppJ schrieb:

    Du könntest das erste Zeichen peek()en.

    Lol, erst Whitespaces skippen.

    SeppJ schrieb:

    Ansonsten würde ich das als Feature ansehen, nicht als Bug.

    Ich würde das als Bug im Standard ansehen, wüsste nicht, inwiefern das sinnvoll sein sollte.

    Ein besser Workaround wäre, eine entsprechende Locale selber zu schreiben, die dann failt.



  • Warum willst du gleich size_t nehmen? Was spricht denn gegen eine Variable mit Vorzeichen als Zwischenschritt?

    std::string inputString = "-5";
        std::stringstream ss(inputString);
        std::size_t outputValue;
        long temp;  //ggf. was Größeres falls long zu klein
    
        if(ss >> temp && temp >= 0)
            outputValue = temp;  //ok
        else
            std::cout << "fehlgeschlagen!\n";
    

    Oder habe ich dein Vorhaben falsch verstanden?



  • Danke Leute ich habe mich jetzt für eine Lösung entschieden wo ich zuerst prüfe ob der String nur Digits containiert. Find ich irgendwie geiler als prüfen auf "-".

    Rewind: Bei deiner Lösung funzen nicht alle legalen Werte von std::size_t. Dann muss man schon wieder in long long einlesen. Ne lieber nicht.


  • Mod

    popmen schrieb:

    Danke Leute ich habe mich jetzt für eine Lösung entschieden wo ich zuerst prüfe ob der String nur Digits containiert. Find ich irgendwie geiler als prüfen auf "-".

    Wenn der Nutzer aber "0xFF" statt "255" schreiben möchte? Oder "+123"?



  • In meinem Fall handelt es sich um das Parsen nach einem definierten Protokoll - keine Benutzereingabe. 🙂



  • lolboy schrieb:

    lol. Das macht genau das gleiche.

    Stimmt. Man könnte denken, das gäbe einen Fehler, tut's aber nicht.

    lolboy schrieb:

    Ich würde das als Bug im Standard ansehen, wüsste nicht, inwiefern das sinnvoll sein sollte.

    +1


  • Mod

    popmen schrieb:

    In meinem Fall handelt es sich um das Parsen nach einem definierten Protokoll - keine Benutzereingabe. 🙂

    Aber das Protokoll kann versehentlich negative Zahlen enthalten?

    Oder mal direkt gefragt: Du hast eine ganz klar definierte Bedingung "kein Minuszeichen als erster non-Whitespace", wieso machst du daraus ohne Not die nicht äquivalente Bedingung "enthält nur Ziffern"?


Log in to reply