2016-07-25 14 views
-5

diesen Code Gegeben:Warum ist string :: substr schlecht?

auto str = "a,b,c"s; 
vector<string> tokens; 
string::size_type start = -1; 
string::size_type finish = str.find(','); 

do { 
    tokens.push_back(str.substr(start + 1, finish)); 
    start = finish; 
    finish = str.find(',', start + 1); 
} while (start != string::npos); 

Ich würde tokens erwarten enthalten:

  1. "a"
  2. "b"
  3. "c"

Wenn ich laufen der Code jedoch bekomme ich:

  1. "a"
  2. "b, c"
  3. "c"

Ich habe in diesem anschaulichen Beispiel Debug-Informationen ausgedruckt: http://ideone.com/fx3uC9

Ist das ein Fehler? Ich sehe es in gcc und Visual Studio, also scheint es, als hätte ich etwas falsch gemacht.

+2

Dies ist, was ein Debugger ist. Dies ist ein sehr kurzer, einfacher, trivialer Algorithmus. Verwenden Sie Ihren Debugger, um den Code Zeile für Zeile durch die Schleife zu durchlaufen. Untersuchen Sie die Werte all dieser Variablen. Sehen Sie, worauf sie hinweisen. Lesen Sie die Beschreibung der 'std :: string' Methoden und was jeder Parameter sein sollte. Finde es heraus. Zu wissen, wie man einen Debugger benutzt, ist eine notwendige Fähigkeit für jeden C++ Entwickler. –

+5

Das zweite Argument für 'substr()' ist eine * Länge *, kein Index. –

+0

Mögliches Duplikat einer Frage, die in einer vergangenen Zeit gestellt wurde, als Fragen auf den neuesten Stand gebracht wurden: http://stackoverflow.com/q/12827030/2642059 –

Antwort

3

Wenn Sie die Dokumentation für substr() lesen, die Signatur:

basic_string substr(size_type pos = 0, 
        size_type count = npos) const; 

Das zweite Argument nicht die Position des Endes ist (wie jede andere Funktion in <algorithm>, die eine Reihe nimmt), dann ist es die Länge der Teilstring. Also wo Sie finish als das Ende haben, brauchen Sie stattdessen finish - (start + 1) als die Länge.

+1

tl; dr blah blah ** lies die Dokumentation für substr() ** blah blah;) –

+1

@ JonathanWakely Es ist eine angenehme Flucht aus dem Dschungel, die Dokumentation ist. – Barry