Frage bezüglich seltsamen fehlers(string methode find() )



  • Heho, folgender Code funktioniert nicht:

    if(codeline.find("name") > -1)
    //blabla
    

    aber folgender schon:

    if(codeline.find("name") >= 0)
    //blabla
    

    Wie kann das sein?
    name ist enthalten, soviel ist sicher. Obere Version funktioniert aber die untere nicht?!?!
    Kann ich mir nicht wirklich erklären

    und wieso scheint der Wert von string::npos irgendwas bei 4 Millionen zu sein?? erhalt ich zumindest, wenn ich den ausgeben lasse



  • Ich nehme an "codeline" ist vom Typ std::string.
    In dem Fall gibt die find()-Methode den Typ size_t zurück. size_t ist Vorzeichenlos, kann also nicht negativ sein.

    Mit der richtigen Warnstufe sollte dein Compiler dich vor so etwas aber auch warnen.



  • Bitte zuerst die mit wichtig markierten Threads lesen und dann ordentliche Fragen posten! (Das gilt grundsätzlich für Foren im Internet, gehört quasi zum guten benehmen). So kann dir keiner ne Antwort geben weil du uns keine Informationen und Anhaltspunkte lieferst.



  • Ja es handelt sich um einen string. Aber laut Dokumentation gibt find() npos zurück, wenn nichts gefunden worden ist(http://www.cplusplus.com/reference/string/string/npos/). Das ist negativ.
    Und selbst wenn nicht, da nur ganze Zahlen vorkommen, ist das doch identisch, oder nicht?



  • Lies mal den letzten Absatz bei deinem Link. Auch wenns als negative Zahl definiert ist, wird am Ende was positives draus. Und da es unsigned ist ist es größer als -1! Das heißt, es gilt immer -1u > -1 . Du vergleichst eben einen unsigned Datentyp mit einem signed Integer.

    Ich an deiner Stelle würde das aber weder mit -1 noch mit 0 vergleichen sondern einfach mit std::string::npos - dazu gibts die Definition schließlich.

    if(codeline.find("name") != std::string::npos)
    //blabla
    


  • hiho,

    der " > " - Operator ist doch ein binärer Operator. ---> er arbeitet mit 2 Operanden.
    Dass er aber arbeiten kann, müssen doch beide Operanden vom selben Datentyp sein.

    Bsp.: in diesem Fall wird doch dann -1 implizit nach "unsigned int" gecastet.:
    -1 --> (2^32)-1

    #include <iostream>
    using namespace std;
    
    unsigned int fkt()
    {
        unsigned int ui = 1;
        return ui;
    }
    
    int main()
    {
        if( fkt() > -1 )    // 1 > (2^32)-1 --> false
            cout << "Test";
    
        system("pause>nul");
        return 0;
    }
    

    stünde dort aber,

    if( fkt() >= 0 )    // ---> true
        cout << "Test";
    

    dann wird nix gecastet da ja beide Operanden schon den gleichen Datentyp haben, und die "if" ist "true".

    ... so müsste das doch sein.



  • touché, vielen dank 🙂
    habs so wie pumuckel dann erklärt hat gemacht, geht wunderbar.
    Kann zu


Log in to reply