strtok, richtige Benutzung?
-
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);
-
nuub schrieb:
char *mesdummy = "hallo #name#, du bist #adjektiv#"; GetPost(mesdummy, "#name#", nam, mesdummy); GetPost(mesdummy, "#adjektiv#", adj, mesdummy);
du solltest als ziel nicht den quellstring verwenden,
a) er wird verändert, so das die funktion im weiteren verlauf mit falschem quellstring arbeitet.
b) er ist in einem read-only bereich und das programm stürzt möglicherweise ab.
-
Beim ersten funktioniert doch alles wunderbar...
beim zweiten passiert irgendwie nichts..
außerdem soll das in den gleichen
-
Du kannst konstante Zeichenketten nicht im Programmlauf verändern.
char* pConst = "Ich bin eine konstante Zeichenkette".
Char Arrays dagegen, kannst du verändern, diese:
char abc[] = "Mich kannst du aendern";
Und diese:
char def[1024] = "Mich kannst du auch aendern";