Negatives Argument für Substr



  • string a = "Hallo Echo!";
    	string b = a.substr ( 0, -3 );
    	cout << b << endl;
    

    Ausgabe:

    Hallo Echo!

    Warum ist das so?
    Ist das so, weil -3 intern zu unsigned int wird, das Argument dadurch sehr groß wird und beim Kopieren nach b zusätzlich die Grenzen von a geprüft werden?


  • Administrator

    staun0r schrieb:

    Ist das so, weil -3 intern zu unsigned int wird, das Argument dadurch sehr groß wird und beim Kopieren nach b zusätzlich die Grenzen von a geprüft werden?

    Ich glaube, du meinst das richtig, aber drückst dich falsch aus.
    Das zweite Argument ( n ) von std::string::substr erwartet einen std::size_t . std::size_t ist ein vorzeichenloser Typ. Also wird aus -3 irgendeine grosse Zahl, welche das gleiche Bitmuster hat.
    In der Funktion werden dann alle Zeichen kopiert von pos (1. Argument) bis pos + n , falls pos + n grösser ist als die Länge des Strings dann einfach alle restlichen.

    So funktioniert die Funktion schliesslich auch mit nur einem Argument. Der Standardwert des 2. Arguments ( n ) ist std::string::npos , was nichts anderes ist als der Rückgabewert von std::numeric_limits<std::size_t>::max() .

    Grüssli


Anmelden zum Antworten