strtok, richtige Benutzung?



  • 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";
    

Anmelden zum Antworten