String in einzelteile Zerlegen
-
Ich suche eine Funktion, die mir einen String nach einem Bestimmten Muster zerlegt und in einen array packt.
in PHP gibt es so eine funktion.
$array = explode(<zeichen>,<string>);
Gibt es sowas ähnliches auch in C? Oder muss ich mir sowas selber basteln (hoffe nicht) ?
Danke
-
In C gibt es dafür [edit] strtok() (das mußt du stückweise durchlaufen lassen und erhälst bei jedem Aufruf einen weiteren Teil des Strings), in C++ kannst du mit std::string::find_first_of() und std::string::substr() bzw. CString FindOneOf() und CString::Mid() etwas zusammenbauen.
-
schade, dass es so eine funktion nicht schon als ganzes gibt. Mein Problem ist dies, dass ich einen String habe von dem ich nicht vorher weiß wie lang er sein wird. Und wie lang die teile zwischen den z.B. ";" ist.
zur veranscheulichung:
L.453;F.3000;FR.2000;R.300;SR.500;
=
array[0] = L.453
usw.
-
Dann nimm am besten Datenstrukturen, bei denen du dich nicht um die erwartete Größe kümmern mußt:
vector<string> explode(const string& input, const string& seperators) { vector<string> ret; size_t st=0,en=input.find_first_of(seperators); do{ ret.push_back(input.substr(st,en-st); st=input.find_first_not_of(seperators,en); en=input.find_first_of(seperators,st); }while(st!=string::npos) return ret; }
-
Dieser Thread wurde von Moderator/in estartu aus dem Forum MFC (Visual C++) in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
OHH Datenstruktoren sind für mich neuland...da muss ich mich dann mal mit beshäftigen..Danke für die Hilfe. Ich versuch mich mal dran.
Wenn einer aber noch andere ideen hat, dann immer rein hier ^^
WARUM verschoben?
Ich doch nen MFC-Problem!!!
-
Uruk-h4j schrieb:
OHH Datenstruktoren sind für mich neuland...da muss ich mich dann mal mit beshäftigen..Danke für die Hilfe. Ich versuch mich mal dran.
Wenn einer aber noch andere ideen hat, dann immer rein hier ^^
OK, das obige ist auch auf C++ ausgelegt, für ein reines C-Programm wird es etwas komplizierter (damals gab's noch keine Containerklassen und ähnliches, also müsstest du mit malloc() und Konsorten etwas eigenes basteln.
WARUM verschoben?
Ich doch nen MFC-Problem!!!
Nicht wirklich (MFC = Microsoft Foundation Classes - eine objektorientierte Wrapper-Bibliothek um die WinAPI).
-
warum ist der thread in C und nicht C++ gelandet? ich seh hier hauptsaechlich c++ code
-
c.rackwitz schrieb:
warum ist der thread in C und nicht C++ gelandet? ich seh hier hauptsaechlich c++ code
Im ersten Posting wurde explizit nach C gefragt:
Uruk-h4j schrieb:
Gibt es sowas ähnliches auch in C?
-
Dieser Thread wurde von Moderator/in TactX aus dem Forum ANSI C in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
estartu schrieb:
c.rackwitz schrieb:
warum ist der thread in C und nicht C++ gelandet? ich seh hier hauptsaechlich c++ code
Im ersten Posting wurde explizit nach C gefragt:
Uruk-h4j schrieb:
Gibt es sowas ähnliches auch in C?
Naja, MFC mit C ist eher schwierig
Ich habs mal nach C++ verschoben. Wenns hier auch falsch ist könnt ihr es ja wieder zurückschieben.
-
probier dies:
char *newstring (char **str, char c) { int l = 0; char *p = 0; while (**str && **str != c) { p = realloc (p, l+2); p[l++] = *(*str)++; } if (p) p[l] = 0; *(*str)++; return p; } char **explode (char *str, char c) { int l; char **strings = 0; for (l=0; ;l++) { strings = realloc (strings, sizeof(char*)*(l+1)); if (0 == (strings[l] = newstring (&str, c))) break; } return strings; } int main() { char **strings, **s; strings = s = explode ("hello-world-doof-dumm-blah-huh", '-'); while (*s) { printf ("%s\n", *s); free (*s); s++; } free (strings); }
aber vorsicht, keine fehlerbehandlung der reallocs...