"explode" funktion
-
HI!
Da ich von php her komme hab ich da auch meinen Programmierstiel her.
Und ich hab oft die "explode" funktion gebraucht (http://de2.php.net/manual/de/function.explode.php).Diese funktion teilt einen string z.b. hallo|tschüss nach einem Trennzeichen in einen array auf.
Dann ist z.b. test[0] hallo und test[1] tschüss.So nun hab ich aber so eine Funktion in C++ vermisst.
Ich hab ums verrecken keine gefunden die sowas ähnliches macht.
Deswegen hab ich mir halt selber eine geschrieben.Und da ich dachte die kann hier vielleicht auch jemand brauchen, poste ich Sie jetzt mal:
// Nötige Headerdateien: #include <string.h> #include <sstream.h> // Funktion: AnsiString explode(char trennzeichen, char *text, int shownpart) { // (c) by J. Frey 2003 AnsiString out; int s; int e=1; FILE *f; int x; int i; s = strlen(text); for (i=0;i<s;i++) { f=fopen("tmpsav","a+"); fputc(text[i], f); fclose(f); if (text[i] == trennzeichen && e == shownpart) { i=s; } if (text[i] == trennzeichen && e != shownpart) { e++; FILE *c; c=fopen("tmpsav","w+"); fclose(c); } fclose(f); } FILE *fk; char test[540]; fk=fopen("tmpsav","r"); while(fgets(test,sizeof(test),fk)) { out += test; } fclose(fk); fk=fopen("tmpsav","w+"); fclose(fk); out.Delete(out.Length(), 1); return out; } // Verwendung AnsiString teststring = "Hallo|mein|freund|"; // Trennzeichen ist hier "|" /* In diesem Fall muss im 2ten Parameter c_str() verwendet werden weil der Paramnter char* erfordert aber AnsoString bekommt. c_str() wandelt dies um. */ AnsiString wort_1 = explode('|', teststring.c_str(), 1); // wort_1 = "Hallo" AnsiString wort_2 = explode('|', teststring.c_str(), 2); // wort_2 = "mein" AnsiString wort_3 = explode('|', teststring.c_str(), 3); // wort_3 = "Freund"
Nochmal zur Erklärung:
AnsiString explode(char trennzeichen, char *text, int shownpart)
gibt einen "AnsiString" Wert zurück.
1. Parameter: Das Trennzeichen welches die Textstücke separiert
2. Parameter: Die Zeichenkette (char*)
3. Parameter: Das Stück welches zurück gegeben werden soll.WICHTIG: Es muss immer am ende der String wieder mit dem Trennzeichen abgeschossen werden.
Ich hoffe ihr könnt was damit anfangen.
Würde mich freuen wenns in die FAQ kommen würde
-
Hochachtung vor der Mühe, die Du Dir gemacht hast. Aber hättest Du das mit strtok nicht einfacher haben können?
mfG, Jens
-
Oder mit TStringList::DelimitedText, oder über direkten Zugriff auf das char-Array des AnsiString.
-
Nix schrieb:
Hochachtung vor der Mühe, die Du Dir gemacht hast. Aber hättest Du das mit strtok nicht einfacher haben können?
mfG, Jens
HI!
Wie meinst du mit StrToK?
Wie funktiert das?Danke für die Antwort
-
Jansen schrieb:
Oder mit TStringList::DelimitedText, oder über direkten Zugriff auf das char-Array des AnsiString.
Kann es sein dass diese Funktion/Eigenschaft in der 5er Version nicht vorhanden ist? Auf jeden Fall konnte ich sie nicht in der VCL-Referenz finden.
Ansonsten geht es auch mit
AnsiString explode(AnsiString trennzeichen, AnsiString text, int shownpart) { AnsiString result; TStringList* strlst = new TStringList; text = StringReplace(text, trennzeichen, "\n", TReplaceFlags() << rfReplaceAll); strlst->SetText( text.c_str() ); if ( (shownpart >= 0) && (shownpart < strlst->Count) ) result = strlst->Strings[shownpart]; delete strlst; return result; }
-
Frey_1 schrieb:
Wie meinst du mit StrToK?
strtok sucht nach einem frei wählbaren Trennzeichen innerhalb eines Strings und setzt vor dieses Zeichen ein \0-Zeichen, bei dem dann ganz normal der erste Teilstring zu Ende ist. Das gleiche beim nächsten usw...
Schau mal in der Hilfe nach. Besser kann ich es auch nicht erklären.mfG, Jens
-
TStringList* Explode(AnsiString asText, AnsiString asDelemiter) { TStringList* slTemp=new TStringList; while(asText.Pos(asDelemiter)>0) { // Feld hinzufügen slTemp->Add(asText.SubString(1,asText.Pos(asDelemiter))); // Abschnitt aus dem Text entfernen asText=asText.SubString(asText.Pos(asDelemiter)+asDelemiter.Length(),asText.Length()-asText.Pos(asDelemiter)-asDelemiter.Length()); } return slTemp; }
EDIT: Man könnte das auch mit AnsiString::Delete machen, aber das funktioniert bei mir irgendwie nicht... Er schneidet den String dann einfach nicht aus.
-
Ich hab jetzt auch noch so ne funktion gemacht die dem ANSI/ISO Stnd. entspricht:
http://www.c-plusplus.net/forum/viewtopic.php?p=494917#494917