strtok, richtige Benutzung?
-
Hi,
ich möchte in einen Text anstelle von bestimmten Zeichen Texte setzen.
jetzt hab ich es mit strtok ausprobiert:char message[] = "Hallo?Hallo2?Hallo3"; char *GetPost(char token[], char *replace) { char *tmpstr = NULL; char dummy[256]; tmpstr = strtok(message, token); while(tmpstr != NULL) { strcat(dummy, tmpstr); strcat(dummy, replace); tmpstr = strtok(NULL, token); } MessageBox(NULL,message,0,0); return dummy; } int main() { GetPost("?", ","); }
-
dummy ist lokal zur funktion. darfst du nicht zurueckgeben, weils nach funktionsende nicht mehr existiert.
hast du ein buch/tutorial? da steht das drin. alternativ steht dir auch dein lehrer zur seite.
-
wtf, du scheinst Recht zu haben ^^
Also wenn man den Wert einer Variablen zurück geben will, darf diese nicht lokal sein, oder wie war das?
--> leider habe ich keinen lehrer :p
-
öhm, irgendwie klappt es schon wieder nicht
char dummy[256]; char dummy2[256]; char *GetPost(char *b1, char tok1[], char *b2, char tok2[]) { char *tmpstr = NULL; memset(dummy, 0x00, sizeof(dummy)); tmpstr = strtok(message, tok1); while(tmpstr != NULL) { strcat(dummy, tmpstr); strcat(dummy, b1); tmpstr = strtok(NULL, tok1); } tmpstr2 = strtok(dummy, tok2); while(tmpstr2 != NULL) { strcat(dummy2, tmpstr2); strcat(dummy2, b2); tmpstr2 = strtok(NULL, tok2); } MessageBox(NULL, dummy2, 0, 0); return dummy2; }
-
Du hast deine dummies nicht initialisiert.
Strcat sucht nach einem Stringende-Zeichen, diesem hier: '\0', wenn keins gefunden wird, gibts Probleme.Du könntest dem dummy also so ein Zeichen spendieren, indem du schreibst:
char aha[256]= "\0";
In deiner zweiten Version ist dummy global, du kannst also deine Funktion als void deklarieren.
Im übrigen macht die Funktion ja nichts anderes, als in einer Zeichenkette das Fragezeichen durch ein Komma zu ersetzen. Das geht wesentlich einfacher.
Gruß,
p.
-
Am besten schaust du gleich noch nach, ob die Variablen die übergeben werden
einen Platz im Speicher gefunden haben ;).
-
erstmal hoer nicht auf die unregs. zur zeit haben wir ne trollplage.
dann... du hast dummy2 nicht gememsettet. da wird irgendein kram stecken, der als stringinhalt interpretiert wird. du solltest zufall im dummy2 vorfinden.
natuerlich wirst du beim strcat() auf dummy2 auch in speicher schreiben, der ausserhalb von dummy2 ist. c checkt keine arraygrenzen.
-
Vielen Dank euch allen
ach und, eigentlich möchte ich auch nur Zeichen in einem String durch andere ersetzen.
Sowie die aus dem .NET-Framework stammende Methode
String.Replace("hi","tschüss");Wie geht das denn einfacher?
Danke noch einmal
-
jhk schrieb:
ach und, eigentlich möchte ich auch nur Zeichen in einem String durch andere ersetzen.
Sowie die aus dem .NET-Framework stammende Methode
String.Replace("hi","tschüss");vielleicht so?
#include <stdio.h> void replace (char *src, char *from , char *to, char *out) { char *f = from; char *t = to; while (*src) { if (*src == *from) { from++; if (*from == 0) { while (*to) *out++ = *to++; to = t; from = f; } } else { from = f; *out++ = *src; } src++; } *out = 0; } void main (void) { char *source = "hello+world-world|world{hello--world"; char out[1024]; replace (source, "world", "universe", out); printf ("%s\n", out); }
-
Funktioniert SuPeR!
Danke!
und danke an die anderen[jetzt muss ich nur noch gucken, ob ich den Code verstehe
]
-
öhm, vista..
Könntest du mir vielleicht erklären, wie deine Funktion funktioniert?Wofür sind zum Beispiel die ganzen '*' und wieso addierst du zu einem string ++ ?
Es wäre sehr nett, wenn da diese erklären könntest..
-
void replace (char *src, char *from , char *to, char *out) { // pointer erstmal speichern, weil diese verändert werden char *f = from; char *t = to; // solange zeichen im eingabestring sind... while (*src) { // zeichen an aktueller position des eingabestrings // entspricht dem zeichen im suchstring? if (*src == *from) { // suchstring-pointer auf nächstes zeichen setzen from++; // ist es 0? // (d.h. der komplette suchstring wurde gefunden)... if (*from == 0) { // ...dann den ersatzstring in den ausgabepuffer kopieren while (*to) *out++ = *to++; // suchstring und ersatzstring für die // nächste runde zurücksetzen to = t; from = f; } } // zeichen an aktueller position des eingabestrings // entspricht *nicht* dem zeichen im suchstring? else { // suchstring zurücksetzen, // denn er könnte vorher inkrementiert worden sein from = f; // ...und einfach das zeichen aus dem eingabestring // in den ausgangspuffer kopieren *out++ = *src; } // auf das nächste zeichen des eingabestrings wechseln // und die schleife wiederholen src++; } // schleife beendet: den ausgabepuffer mit einer 0 abschliessen *out = 0; }
-
Danke, nun hab ich es ein bisschen besser verstanden, nur leider noch nicht vollständig
aber weshalb steht da z.b.:
if(*from == 0)und warum nicht
if(from == 0)ist der stern sehr wichtig?
-
Oooh jaa, sehr wichtig !
Der Stern ist der sogenannte Dereferenzierungsoperator. Mit dem kannst du dir den Inhalt angucken, auf den der Zeiger gerade zeigt.#include <stdio.h> int main () { char *source = "hello vista"; // source ist zeiger auf zeichenkette printf( "%c\n", *source ); // ausgabe h source++; // der zeiger zeigt ein byte weiter printf( "%c\n", *source ); // ausgabe e source++; // der zeiger zeigt ein byte weiter printf( "%c\n", *source ); // ausgabe l source++; // der zeiger zeigt ein byte weiter printf( "%c\n", *source ); // ausgabe l source++; // der zeiger zeigt ein byte weiter printf( "%c\n", *source ); // ausgabe o source++; // der zeiger zeigt ein byte weiter printf( "%c\n", *source ); // ausgabe l return 0; }
-
danke, gucke ich mir jetzt mal an
Offtopic:
ich brauche mal ganz schnell Hilfe bitte:
strcat(buffr, tmplength);
wobei tmplength vom typ int ist, sodass es eine Fehlermeldung (Access Violation) gibt. wie kann ich es richtig machen?strcat(buffr, (char *)tmplength);
scheint auch nicht zu funktionieren
-
jhk schrieb:
Wie geht das denn einfacher?
#include <stdio.h> void replace_light( char* str, char cOld, char cNew ) { while(*str) { if ( *str == cOld ) *str = cNew; str++; } } int main () { char str[] = "?Hallo?Echo?"; replace_light ( str, '?', '!' ); puts(str); return 0; }
-
nuub schrieb:
ich brauche mal ganz schnell Hilfe bitte
Immer ruhig mit den jungen Pferden, das ist keine Notdienstzentrale hier.
Siehe deklaration von strcat:
char *strcat( char *strDestination, const char *strSource );
Da kannst du nicht einfach einen int dranhängen. Benutz doch eifach weiter char*, so wie du es bisher gemacht hast.
-
ich muss die zahl, die in tmplength enthalten ist, an den string dranhängen...
-
int main () { char cHaengDichAn[256]= "Eins Eins Null-> "; int tmplength = 110; sprintf( cHaengDichAn, "%s%d", cHaengDichAn, tmplength ); puts(cHaengDichAn); return 0; }
-
Vielen Dank euch allen!
Noch einmal kurz zum Them zurück:
1. so sieht die Funktion aus:void GetPost(char *str, char *in , char *repl, char *out) { char *dummy1 = in; char *dummy2 = repl; while (*str) { if (*str == *in) { in++; if (*in == 0) { while (*repl) *out++ = *repl++; in = dummy1; repl = dummy2; } } else { in = dummy1; *out++ = *str; } str++; } *out = 0; }
2. Das möchte ich machen, wenn ich nur eines von beiden ausführe, klappt alles wunderbar, wenn ich beides machen möchte, passiert nichts weiter, und außerdem sind die '#' nach dem ersten mal ersetzen weg...
char *mesdummy = "hallo #name#, du bist #adjektiv#"; GetPost(mesdummy, "#name#", nam, mesdummy); GetPost(mesdummy, "#adjektiv#", adj, mesdummy);