PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++]Dynamisches Stringsplitting



wacked
06.09.2009, 18:54
Da ja hier keiner was macht und das auch was eher nützliches ist...
Die Aufgabe ist einen STL String in seine einzelen Teile zu splitten. Der Gebauch von Vektoren ist SEHR zu empfehlen.
Viel spaß
ich hab ne denkblockade nehmt es nicht als perfekte lösung:


void mysplit(vector<string> &v,string str,char c){
int count=0;
while(1){
count=str.find(c);
v.push_back(str.substr(0,count));
str=str.substr(count+1);
if(str.find(c)==string::npos){
v.push_back(str.substr(0));//ugly hack detected
break;
}
}
}

Ich weiß nich,hab keinen Bock mehr darauf und werde müde. Beim vorletzen Durchlauf macht er das letzte leerzeichen weg also wird keins mehr gefunden. Deswegen hab ich jetzt diesen kleine ugly hack drin. immerhin funktioinerts...
wer irgendteine andere Lösung hat nur rein damit

-[RiDER]-
07.09.2009, 15:04
Die Aufgabe ist einen STL String in seine einzelen Teile zu splitten.

Was denn fuer Teile???
Und was ist mit strtok() und strsep()?
Sorry, komme aus der C-Ecke ;)

GreetZ jmcr :D

blackberry
07.09.2009, 15:32
@RiDER
Teile = (in diesem Fall) tokens
Also im Grunde eine Schleife strtok() und nur einem deliminater/Trennzeichen, wobei die generierten Tokens in einem Vektor abgespeichert werden sollen...

@wacked

/*
Ausgabe:
string = 'Das ist ein Test!'
#1 = 'Das'
#2 = 'ist'
#3 = 'ein'
#4 = 'Test!'
*/
#include <iostream>
#include <string>
#include <vector>


using namespace std;

int strtokenize(string str, vector<string> *tokens, char delim)
{
int size;

tokens->empty();

while((size = str.find(delim)) != string::npos)
{
tokens->push_back(str.substr(0, size));
str = str.substr(++size);
}
tokens->push_back(str.substr(0, size));

return tokens->size();
}

int main(void)
{
int i;
string str = "Das ist ein Test!";
vector<string> tokens;

strtokenize(str, &tokens, ' ');
printf("string = '%s'\n", str.c_str());
for(i = 0; i < tokens.size(); i++)
{
printf("#%d = '%s'\n", (i + 1), tokens[i].c_str());
}

getchar();
return 0;
}

aL1ien
09.02.2010, 07:50
vector<string> getSeparateStringsFromDelimString( const string& s, const string& f )
{
vector<string> temp;
if ( f.empty() )
{
temp.push_back( s );
return temp;
}
typedef string::const_iterator iter;
const iter::difference_type f_size( distance( f.begin(), f.end() ) );
iter i( s.begin() );
for ( iter pos; ( pos = search( i , s.end(), f.begin(), f.end() ) ) != s.end(); ) {
temp.push_back( string( i, pos ) );
advance( pos, f_size );
i = pos;
}
temp.push_back( string( i, s.end() ) );
return temp;
}

string getStringWithDelimFromVector( vector<string> stringWithouthDelim,string delim )
{
string stringWithDelim;
if(stringWithouthDelim.size() == 0)
return stringWithDelim;
for(int i = 0; i < stringWithouthDelim.size(); i++)
{
stringWithDelim += stringWithouthDelim[i];
if( i != (stringWithouthDelim.size()-1) )
stringWithDelim += delim;
}
return stringWithDelim;
}