Einzelnes Zeichen aus String löschen (das erste)
-
Hallo allerseits,
ich versuche gerade eine Funktion zu programmieren, welche einen String in seine einzelnen Worte aufteilen sollte(!), ich schaffe es schon das erste Wort abzutrennen, mein Problem bleibt allerdings, dass das Leerzeichen stehenbleibt, und ich deswegen keine weiteren Worte auslesen kann.#include <fstream> #include <iostream> #include <string>//Includes teilweise für andere Programmteile benutzt #include <windows.h>//also nicht wundern das hier jetzt unbenutzte Include's stehen #include <conio.h> using namespace std; void stringtrenner(string part) { int x=0, sl=0, anzahl=0; string parts[20]; //vorerst auf 20 gesetzt, längere Sätze werden ersteinmal nicht kommen sl = (part.length()+1); // Wie lang ist der String for(int i=0; i<sl; i++)// Unausgereift: Wie viele Leerzeichen sind vorhanden { if(part.find(" ")) // Unausgereift: Wie viele Leerzeichen sind vorhanden { anzahl++; } } for(int i=0; i<anzahl; i++) { size_t strpos = part.find(" ");//findet die Position vom Leerzeichen parts[i]=part.substr(0, strpos);// Trennt das Wort bis zum Leerzeichen ab cout << parts[i] << endl ; //gibt das gespeicherte Wort aus part.erase(0, strpos); //löscht das gespeicherte Wort aus dem String i++; x=i ; } cout << part ;//Das letzte Wort? } int main() { stringtrenner("Test St ring"); //der String der in seine Einzelteile zerlegt werden soll }Für Anregungen und Hilfe wäre ich dankbar
lg - koen
-
#include <vector> #include <string> #include <sstream> #include <iostream> std::vector< std::string > stringsplitter( char const *str ) { std::vector< std::string > result; std::stringstream ss( str ); std::string word; while( ss >> word ) result.push_back( word ); return result; } int main() { std::vector< std::string > words = stringsplitter( "Franz jagt im komplett verwahrlosten Taxi quer durch Bayern" ); for( auto i = words.begin(); i != words.end(); ++i ) std::cout << *i << '\n'; }// edit: Plan B ohne
stringstream:#include <cctype> #include <vector> #include <string> #include <iostream> std::vector< std::string > stringsplitter( std::string const &str ) { std::vector< std::string > result; std::string word; for( auto i = str.begin(); i != str.end(); ++i ) { if( !std::isspace( *i ) ) { word += *i; } else if( !word.empty() ) { result.push_back( word ); word = ""; } } if( !word.empty() ) result.push_back( word ); return result; } int main() { std::vector< std::string > words = stringsplitter( "Franz jagt im komplett verwahrlosten Taxi quer durch Bayern" ); for( auto i = words.begin(); i != words.end(); ++i ) std::cout << *i << '\n'; }
-
alle Änderung sind mit ## markiert
#include <fstream> #include <iostream> #include <string>//Includes teilweise für andere Programmteile benutzt #include <windows.h>//also nicht wundern das hier jetzt unbenutzte Include's stehen #include <conio.h> #include <algorithm> // std::count using namespace std; void stringtrenner(string part) { int x=0, sl=0, anzahl=0; string parts[20]; //vorerst auf 20 gesetzt, längere Sätze werden ersteinmal nicht kommen sl = (part.length()+1); // Wie lang ist der String // -- ## // entweder: for( int i=0; i<part.length(); ++i ) if( part[i] == ' ' ) ++anzahl; // oder: anzahl = std::count( part.begin(), part.end(), ' ' ); //for(int i=0; i<sl; i++)// Unausgereift: Wie viele Leerzeichen sind vorhanden //{ // if(part.find(" ")) // Unausgereift: Wie viele Leerzeichen sind vorhanden // { // anzahl++; // } //} for(int i=0; i<anzahl; i++) { size_t strpos = part.find(" ");//findet die Position vom Leerzeichen parts[i]=part.substr(0, strpos);// Trennt das Wort bis zum Leerzeichen ab cout << parts[i] << endl ; //gibt das gespeicherte Wort aus part.erase(0, strpos+1); //löscht das gespeicherte Wort UND DAS SPACE-ZEICHEN aus dem String ## // i++; ## // x=i ; ## } cout << part << endl ;//Das letzte Wort? ## endl vergessen } int main() { stringtrenner("Test St ring"); //der String der in seine Einzelteile zerlegt werden soll }