letzte Spalte aus string extrahieren
-
Ich habe eine Funktion geschrieben, die die letzte Spalte aus einem String extrahiert und gleichzeitig mögliche leerzeichen nach der letzten spalte löscht. zurückgeben wird dann die letzte spalte ohne leerzeichen davor und danach. (bsp. "o3 34 4546 dfkdfj dfdsf " wird zu "dfdsf")
string Input::extractLastColumn( string str ) { size_t found; found = str.find_last_of(" "); while(str[found+1] == ' ') { str = str.substr(0,found-1); found = str.find_last_of(" "); } return str.substr(found+1); }Nur leider funktioniert das nicht so ganz.
findet irgendjemand einen fehler?
-
cuba1 schrieb:
Ich habe eine Funktion geschrieben, die die letzte Spalte aus einem String extrahiert und gleichzeitig mögliche leerzeichen nach der letzten spalte löscht.
Nö - tut sie nicht.
Überleg dir mal Schritt für Schritt was genau passiert.Noch ein Hinweis:
Wenn du beispielsweise "hallo " übergibst, welchen Wert wird dann wohl found haben?
Und worauf greifst du dann mit str[found+1] zu?
-
Die Bedeutung von find_last_of ist dir aber schon klar oder?
Searches the string from the end for any of the characters that are part of either str, s or c, and returns the position of the last occurrence in the string.
Deine while-Schleife wird also nie ausgeführt weil die Bedinung str[found+1] == ' ' immer falsch ist. Wenn du ein Leerzeichen am Ende hast dürfte dir das sogar crashen.
-
Machs so und gut ist:
string Input::extractLastColumn( string str ) { std::stringstream strm(str); std::string buf; while (strm >> buf); return buf; }
-
ups, ja danke da habt ihr natürlich recht.
ich habs jetzt noch mal anders versuch (zuerst werden leerzeichen am schluss abgetrennt und erst dann wird die letze spalte extrahiert)string Input::extractLastColumn( string str ) { size_t found; while(*str.end()==' ') { str.erase(str.end()); } found = str.find_last_of(" "); return str.substr(found+1); }es mag aber leider immer noch nicht klappen

-
So gehts:
std::string str = "o3 34 4546 dfkdfj dfdsf "; size_t trim = str.find_last_not_of( ' ' ); size_t pos = str.find_last_of( ' ', trim ); if( pos != std::string::npos ) { std::string sub = str.substr( pos + 1, trim - pos ); std::cout << sub; } else { std::cout << "not found"; }
-
klöklö schrieb:
Machs so und gut ist:
string Input::extractLastColumn( string str ) { std::stringstream strm(str); std::string buf; while (strm >> buf); return buf; }Danke klöklö, so funktionierts.
-
string extractLastColumn( string str ) { while (*(str.end() - 1) == ' ') { str.pop_back(); } size_t pos = str.rfind(" "); if (pos != std::string::npos) { str = str.substr(pos + 1); } return str; }Und gewöhn dir mal an zu sagen WAS nicht klappt. Deine Fehlerbeschreibungen sind nichtssagend.
Und warum machst du es nicht mit std::stringstream? Ich hab dir doch einen schönen Weg gezeigt.
-
cuba1 schrieb:
Danke klöklö, so funktionierts.
Nur hast du nun nichts gelernt. Bringt dich also leider kein Stück weiter.