Warnung mit 'std::string::npos' in if-Bedingung?



  • Hallo Leute,

    bei meinem folgenden Codebeispiel bekomme ich die Warnung: "comparison between signed and unsigned integer expressions". Kann jemand sehen wo mein Fehler liegt?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main()
    {
    	std::string myString = "Value = 123";
    
    	int pos = myString.find("=");
    	if (pos != std::string::npos) // --> Warning: "comparison between signed and unsigned integer expressions"
    	{
    		// ...irgendwas...
    	}
    
    	return 0;
    }
    

    Soweit ich weiß liefert 'std::string::npos' die Zahl -1 zurück. Die Variable 'pos' ist ebenfalls eine vorzeichenbehaftete Zahl. Wie kommt die Warnung zustande? Wenn ich 'myString.find("=")' direkt in die if-Bedingung einsetze oder aus 'pos' ein unsigned int mache, dann verschwindet die Warnung.

    ...sehr verwirrend 😕

    ....ich verwende Eclipse mit g++ und c++11. Weiß jemand Rat?

    viele Grüße,
    SBond



  • Benutze statt int size_t. Allgemein ist size_t für Indizes etc. gegenüber int vorzuziehen.



  • Npos ist der gelieferte Wert. Benutze auto oder den dokumentierten Datentyp (size_type).



  • ok danke.

    size_t funktioniert soweit 🙂



  • Noch besser ist es std::string::size_type zu benutzen, weil das genau der Datentyp ist, der std::string::find(..) zurückgibt.

    http://en.cppreference.com/w/cpp/string/basic_string/find

    Und noch besser als besser ist es hier auto zu benutzen - so spart man Tipparbeit und ist für allfällige Änderungen am Interface von std::string gewappnet (was wohl nie der Fall sein wird, hier aber exemplarisch passt).

    ~(wie manni66 etwas kürzer schon erwähnt hat... sehe ich gerade...)~



  • Die Header

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    

    benutzt man in C++ nicht mehr, das sind C Header. Die Header der C++ STL haben in der Regel keinen Suffix mehr. Für std::string reicht es aus, <string> zu inkludieren.



  • DocShoe schrieb:

    Die Header

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    

    benutzt man in C++ nicht mehr, das sind C Header. Die Header der C++ STL haben in der Regel keinen Suffix mehr. Für std::string reicht es aus, <string> zu inkludieren.

    ok 🙂

    ...ja die Macht der Gewohnheit. Vielen Dank für die Hilfe 😃


  • Mod

    Insbesondere bei string.h wichtig, das überhaupt nichts mit der Klasse std::string zu tun hat, sondern dem C++-Header cstring entspricht (aka Funktionen zur Verarbeitung nullterminierter Zeichenketten).



  • leider falsch.

    Letztlich kann der Compiler einen nicht retten. Man will immer mal zum Bleistift ptrdiff_t mit size_t vergleichen oder zuweisen. Mhhm, ich eigentlich nicht, aber die Codebase vor mir eigentlich so viele male wie es Sterne im Universum gibt.

    Mein dbOffset=i_know_what_i_want_cast<ptrdiff_t,size_t>(&foo.cl-&foo.rpl) ist sicherlich nicht marktfähig.


  • Mod

    volkard schrieb:

    Letztlich kann der Compiler einen nicht retten. Man will immer mal zum Bleistift ptrdiff_t mit size_t vergleichen oder zuweisen. Mhhm, ich eigentlich nicht, aber die Codebase vor mir eigentlich so viele male wie es Sterne im Universum gibt.

    Heißt in diesem Fall doch bloß, dass der Programmierer etwas falsch gemacht hat, weil er, um es mal geometrisch auszudrücken, einen Punkt mit einer Länge verglichen hat. Mindestens eines davon muss ein unpassender Typ gewesen sein oder seine Logik passt nicht.


Log in to reply