String teilen
-
Ich will aus einer langen String die mit Leerzeichen getrennt ist viele kleine machen. Wie viele einzelen Wörter in der großen String sind ist definiert(5).
Bsp.
GroseString = "Vorname Nachname Telefon Alter Ort "
und daraus soll werden
Teil[1] = "Vorname"
Teil[2] = "Nachname"
Teil[3] = "Telefon"
Teil[4] = "Alter"
Teil[5] = "Ort"Ich würde gerne einen Befehl haben, der das macht, aber ein Problem ist das die " " nicht mit angezeigt werden sollen, und ganz hinten, hinter Ort soll das Leerzeichen auch weg.
Wie geht das

-
-
Hi,
das kann man recht komfortabel mit std::istringstream machen (ohne boost nutzen zu müssen).
(BTW: "GString" kenne ich nicht in dem Zusammenhang, beziehe mich auf std::string)Nicht getestet ... irgendwie so:
std::string s = "Vorname Nachname Telefon Alter Ort "; std::istringstream in(s); std::vector<std::string> Teile(5); for(int i=0; i<5 && (in >> Teile[i]); ++i);Leider muss ich jetzt fix weg, aber vllt. suchst Du mal im Forum dazu.
Gruß,
Simon2.
-
Ich bin sher neu bei dem Qulletext sagt C++ aber das er nicht std kennt. Muss ich noch irgendwas machen? Vieleicht irgenwas includen?
Ist bistimmt eine blöde frage,würde aber gerne eine Antwort haben.
-
Ok, jetzt habe ich das programm zum laufen bekommen beim den Ausgeben in ein Label sagt er jetzt aber:
E 2034 Konvertierung von '_STL::string' nach 'AnsiString' nicht möglich
Wie kann ich das Konfertieren?
-
Stratege993 schrieb:
Ok, jetzt habe ich das programm zum laufen bekommen beim den Ausgeben in ein Label sagt er jetzt aber:
E 2034 Konvertierung von '_STL::string' nach 'AnsiString' nicht möglich
Einfach in der entsprechenden Zeile in c_str() hier std::string setzen ..
Wie kann ich das Konfertieren?Label1->Caption = mystring.c_str();
-
OK es geht.
Danke!
-
Stratege993 schrieb:
Ich bin sher neu bei dem Qulletext sagt C++ aber das er nicht std kennt. Muss ich noch irgendwas machen? Vieleicht irgenwas includen?
Ist bistimmt eine blöde frage,würde aber gerne eine Antwort haben.Hi,
ja sorry, musste gerade dringend weg.
Hier eine getestete Version (ohne "eye candy"):
#include <string> using std::string; #include <vector> using std::vector; #include <sstream> using std::istringstream; #include <iostream> using std::cout; using std::size_t; int main (int argc, char **argv) { string s = "Vorname Nachname Telefon Alter Ort "; istringstream in(s); vector<string> Teile(5); // 5 Plätze vorreservieren // solange auslesen, bis wir 5 haben oder das Einlesen fehlschlägt for(size_t i=0; i<5 && (in >> Teile[i]); ++i); // Ausgeben for(size_t i=0; i<Teile.size(); ++i) cout << i << ". String " << Teile[i] << "\n"; return 0; }... und noch eine "eye candy"-Variante:
#include <string> using std::string; #include <vector> using std::vector; #include <sstream> using std::istringstream; #include <iostream> using std::cout; #include <algorithm> using std::copy; #include <iterator> using std::ostream_iterator; using std::istream_iterator; using std::size_t; int main (int argc, char **argv) { string s = "Vorname Nachname Telefon Alter Ort "; istringstream in(s); vector<string> Teile; // Einlesen in Teile: copy(istream_iterator<string>(in), istream_iterator<string>(), back_inserter(Teile)); // Ausgabe nach cout copy(Teile.begin(), Teile.end(), ostream_iterator<string>(cout, " ")); return 0; }Mit dem "iteratoren-Gedöns" sagt man dem Compiler, dass man aus einem Stream oder Container "Stück-für-Stück" Inhalte auslesen will und back_inserter "weiß", wie man an einen Container ein weiteres Element anhängt....
Aber um das lesen zu können, braucht man schon einiges an C++-Erfahrung...
aber EIN Vorteil der zweiten Variante ist, dass man nirgends das Wissen braucht, wie viele "Tokens" im String s stecken. Er ist also flexibler und robuster.Gruß,
Simon2.