strtok-Fehler in Funktion



  • Nabend!
    Bei meinem Programm fliege ich immer in Zeile 7 aus dem Programm. Wisst ihr wieso?

    #include <stdhio.h>
    #include <string.h>
    
    void TeilstringsAusgeben(char *roh_string)
    {
    	char *roh_zeiger
    	roh_zeiger = strtok(roh_string, "\n")) == NULL) //Hier wird's frech
    	while(roh_zeiger)
    	{
    		printf("%s\n", roh_zeiger);
    		roh_zeiger = strtok(NULL, "\n");
    	}
    }
    
    int main()
    {
    	char roher_string[] = "\n\nZwirbel\nIngwer mit Schuss\n";
    	TeilstringsAusgeben(roher_string);
    
    	return 0;
    }
    

    Wäre nett, wenn ihr mir helfen könntet!



  • roh_zeiger = strtok(roh_string, "\n")) == NULL)
    

    LOL, einmal auf und dreimal zu? 😃



  • Soll natürlich

    roh_zeiger = strtok(roh_string, "\n");
    

    heißen. Hab den Code hier auf das Problem beschränkt und gekürzt. War wohl noch ne halbe Prüfung drin.



  • Ich kann das bei mir problemlos kompilieren und ausführen..



  • cooky451 schrieb:

    Ich kann das bei mir problemlos kompilieren und ausführen..

    Also es geht bei mir auch, eben getestet.. Aber ich hab vor, einen Zeiger zu übergeben. So:

    [cpp]int main()
    {
    char *roher_string = malloc(1000);
    roher_string = "\n\nZwirbel\nIngwer mit Schuss\n";
    TeilstringsAusgeben(roher_string);

    return 0;
    }

    Dann schlägts bei mir fehl.



  • Jochenbart schrieb:

    cooky451 schrieb:

    Ich kann das bei mir problemlos kompilieren und ausführen..

    Also es geht bei mir auch, eben getestet.. Aber ich hab vor, einen Zeiger zu übergeben. So:

    int main()
    {
        char *roher_string = malloc(1000); // roher_string zeigt auf einen gerade reservierten Speicherbereich
        roher_string = "\n\nZwirbel\nIngwer mit Schuss\n"; // roher_string zeigt auf einen komplett anderen Speicherbereich
        TeilstringsAusgeben(roher_string);
    
        return 0;
    }
    

    Dann schlägts bei mir fehl.

    Ich hoffe hier wird klar, dass dein Vorgehen nicht sinnvoll ist 😉
    Schonmal

    const char* string = "asdfasdfasdf";
    

    Probiert? 😃

    Zudem:
    Bitte poste einfach ein möglichst kurzes, aber lauffähiges Programm das den Fehler reproduziert; nur so kann dieser auch schnell gefunden werden.



  • roher_string = "\n\nZwirbel\nIngwer mit Schuss\n";
    

    ist ein Stringlateral. Dadurch zeigt jetzt roher_string auf diesen String.
    Der wird nicht in den Bereich von malloc(1000) kopiert. Der Bereich von malloc geht dadurch verloren.

    Stringliterale sind nicht veränderbar. strtok verändert aber den String, indem es '\0'an die Stelle der Trennzeichen schreibt.



  • Der Fehler ist halt, dass strtok() in Zeile nicht so arbeitet, wie ich es mir wünsche... Da gibts einen Speicherzugriffsfehler.

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    void TeilstringsAusgeben(char *roh_string)
    {
        char *roh_zeiger;
        roh_zeiger = strtok(roh_string, "\n");
        while(roh_zeiger)
        {
            printf("%s\n", roh_zeiger);
            roh_zeiger = strtok(NULL, "\n");
        }
    }
    
    int main()
    {
        const char *roher_string = "\n\nZwirbel\nIngwer mit Schuss\n";
        TeilstringsAusgeben((char*)roher_string);
    
        return 0;
    }
    


  • Liest du die Beiträge hier überhaupt? Oder Compiler Warnungen? Oder irgendwas? 😃



  • const char * bedeutet, dass du den String eben nicht verändern kannst.

    Der Hinweis von cooky mit dem const war der Wink mit dem Zaunpfahl dass Stringliterale nicht veränderbar sind.

    Arrays hingegen sind veränderbar:

    char roher_string[] = "\n\nZwirbel\nIngwer mit Schuss\n";
    

    oder von deinem ersten Beispiel:

    char *roher_string = malloc(1000); 
        strcpy(roher_string,"\n\nZwirbel\nIngwer mit Schuss\n");
    

    Tipp: Vergiss Zuweisungen bei Strings mit =
    Nicht machen. Nur wenn du weißt was du tust. Also niemals.


Anmelden zum Antworten