Archiv verlassen und diese Seite im Standarddesign anzeigen : Cpp: String parsen
Hallo,
stehe vor einem kleinen Problem. Und zwar würde ich gerne den Wert eines StringObjekts an den Whitespaces zerlegen in weitere StringObjekte. Zum Beispiel so:
std::string test = "das ist mein test string";
Jetzt soll jeweils "das", "ist", "mein" usw. in einen neuen String abgelegt werden. Vorzugsweise in einer while-Schlife, damit ich immer in den selben "neuen" string speichern kann. Also etwa so:
std::string test = "das ist mein test string";
std::string2;
while(test){
string2 = fkt(hole immer aktuelles wort);
}
Leider habe ich derzeit keine Idee, wie ich das bewerkstelligen könnte.
Wäre super, wenn ihr mir helfen könntet.
Danke im Voraus
#include <iostream>
#include <string>
#include <list>
#include <cctype>
int main() {
std::string s = " dies ist\tein text \t \vmit\r\n whitespaces drinnen ";
std::list<std::string> splited;
std::string buf;
for( std::string::const_iterator it = s.begin(), end = s.end(); it != end; ) {
while( it != end && std::isspace( *it ) ) ++ it;
buf.clear();
while( it != end && !std::isspace( *it ) ) {
buf += *it;
++ it;
}
if( buf.size() > 0 )
splited.push_back( buf );
}
for( std::list<std::string>::const_iterator lit = splited.begin(), lend = splited.end(); lit != lend; ++ lit ) {
std::cout << '"' << *lit << '"' << std::endl;
}
return 0;
}
anda_skoa
20-01-2006, 17:15
Warum so kompliziert, wenn das mit einem string stream viel einfacher geht?
Einfach zuerst den Inputstring in den Stream schreiben, dann Wort für Wort rauslesen.
Ciao,
_
Warum so kompliziert, wenn das mit einem string stream viel einfacher geht?
Einfach zuerst den Inputstring in den Stream schreiben, dann Wort für Wort rauslesen.
Ciao,
_
Ob das komplezierter ist, ist streitsache. Fest steht das bei der stringstream lösung du einaml den zu parsenden string ganz in den string stream kopierst, dann kopierst du die einzelnen wörter raus und die wörter kopierst du dann in die liste rein. Bei dieser lösung kopierst du einmal weniger, da du den string direkt parst und dann nur noch die wörter rauskopierts und dan in die liste rein kopierst.
Würde es nicht auch mit folgender Schleife einfacher gehen:
while( (n=find_first_of("\n\t")) == string::npos )
Darin speichert man dann bis zur Position n und wirft diesen Teil mit dem gefunden Whitespace weg. Das wird dann solange wiederholt bis kein Leerzeichen oder Tabulator mehr drin ist.
anda_skoa
21-01-2006, 14:17
Ob das komplezierter ist, ist streitsache.
Stimmt, war vielleicht nicht richtig formuliert. Ich meinte es geht damit mit weniger Code.
Allerdings dürfte eine Lösung wie Caveman sie vorschlägt vermutlich am günstigsten sein.
Ciao,
_
da lob ich mir halt sprachen wie python. da tippt man z.B. das in die python-shell ein:
>>> " foo\t\rbar \n baz \v ".split()
['foo', 'bar', 'baz']
Danke euch - hatte vergessen zu schreiben, dass ich es bereits gelöst hatte. Mit einem StringStream. :-)
Danke trotzdem.
h.d.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.