String Spaltung..
-
Mein string:
str = "hallo | auto | test | ende";Jetzt will ich die einzelnen Inhalte speichern:
if(str.find("|") != string::npos) { int begin = 0; for(int i = 0; i < str.size(); i++) { if(str[i] == '|') { cout << "pos:" << i << endl; string x = str.substr(begin, i-begin); cout << "exec:[" << x << "]" << endl; begin = i+2; } } }Die Methode sucht den string bis zum Trennzeichen '|' ab und dann wird der Inhalt gespeichert so lange bis keins Trennzeichen da ist. Doch wie bekomme ich den letzten Wert "ende" gespeichert?
-
das heißt dieser code wird nur ausgeführt wenn du ein | findest
if(str.find("|") != string::npos)nun ist aber "ende" nach dem letzen | und nach "ende" kommt kein | mehr, also entweder passt du den string an(schlechtere lösung) oder du gehst erstmal davon aus, das nach einem | prinzipiell immer noch ein token kommt. In diesem Fall wäre das dann " ende". um an das letzte token zu kommen müsste du also einfach noch den rest abarbeiten
also sowas
if(str.find("|") != string::npos) //wie vorher else{ //hier dann den besonderen fall }edit: du kannst auch mal hier gucken http://www.cppreference.com/cppstring/index.html
string kennt zb. sowas wie find(char) damit kannst du dir die for schleife sparen..
-
Folgender Code klappt recht gut:
std::vector<std::string> split(std::string const& str, std::string const& sep) { using std::string; std::vector<string> ret; string::size_type last = 0; string::size_type i; while ((i = str.find(sep, last)) != string::npos) { ret.push_back(str.substr(last, i - last)); last = i + 1; } ret.push_back(str.substr(last)); return ret; }
-
vielen dank mit der Funktion klappts prima

vector<string> token = split(str,"|"); for(int i = 0; i < token.size(); i++) { cout << token[i] << endl; }Ab dem 2. Token ist an der ersten Stelle ein Leerzeichen, kann man dies in der Funktion beseitigen`?
-
kernel64 schrieb:
Ab dem 2. Token ist an der ersten Stelle ein Leerzeichen, kann man dies in der Funktion beseitigen`?
Na ja, Leerzeichen kann man separat wegstreichen:
std::string trim(std::string const& str) { using std::string; string ret = str; string::size_type i; if ((i = ret.find_first_not_of(" \t")) != string::npos) ret = ret.substr(i); else return ""; if ((i = ret.find_last_not_of(" \t")) != string::npos) ret = ret.substr(0, i + 1); return ret; }
-
dein code geht aber davon aus, das kein leerzeichen innerhalb des strings enthalten sein soll
also sowas "das ist ein token" würde dein code zu "dasist eintoken" machen
ob das nun gewünscht ist oder nicht hängt natürlich von der aufgabenstellung ab.da ist nun der threadersteller gefragt
-
ConfusedGuy schrieb:
dein code geht aber davon aus, das kein leerzeichen innerhalb des strings enthalten sein soll
Wieso?
cout << trim("das ist ein token") << endl; // = "das ist ein token"
-
args, hab kurzerhand mal
ret.find_last_not_of und ret.find_first_not_ofin
ret.find_last_of und ret.find_first_ofumgewandelt beim denken
sorry, hast recht
