strtok



  • Hallo Zusammen,

    ich möchte gerne aus einem String (zum Beispiel : "/Documents\n" das "\n" löschen. Dachte ich nehme strtok dafür:

    char input[20];
    char *path;
    
    fgets(eingabe, 20, stdin);
    path = malloc(strlen(eingabe+1));
    if(path == NULL){
        printf("Fehler %s\n", strerror(errno));
        return EXIT_FAILURE;
    }
    
    path = strtok(input, "\n");
    

    Dabei ist path aber leer... Jemand ne Idee?

    Grüße



  • Was ist denn eingabe und was ist input ?



  • Meinte das so:

    char input[20];
    char *path;
    
    fgets(eingabe, 20, stdin);
    path = malloc(strlen(input+1));
    if(path == NULL){
        printf("Fehler %s\n", strerror(errno));
        return EXIT_FAILURE;
    }
    
    path = strtok(input, "\n");
    


  • Ahh..ergibt Sinn.
    Aber warum strtok() ? Warum nicht strchr() oder so?

    Ich frage: weil ich nicht weiss, wass jetzt eigentlich Dein Plan ist - bei mir funktioniert Dein Programm soweit ich das beurteilen kann. Wenn ich was mit \n am Ende eintippe ist das \n weg.

    Wenn's allerdings nur das \n am Ende ist: warum dann nicht gleich scanf() ?

    Also Was erwartest Du? Was bekommst Du? Wie sind Deine Eingaben?

    Mehr Fragen als Antworten. 🙂



  • Also der Plan war eine Pfadeingabe einzulesen. Wenn ich aber fgets nutze schreibt der ja das Enter ans Ende mit \n oder nicht? Und mit scanf kann man doch nur ein Zeichen einlesen?



  • Furble Wurble schrieb:

    Ahh..ergibt Sinn.

    Unsinn, das ergibt überhaupt keinen Sinn.

    char input[20];
    fgets(input, 20, stdin);
    strtok(input, "\n");
    printf("Die Eingabe war (%s)",input);
    

    path ist hier vollkommen überflüssig.



  • Vielen Dank


  • Mod

    lordvincent schrieb:

    Und mit scanf kann man doch nur ein Zeichen einlesen?

    Nein, im Gegenteil. Wie kommst du denn auf die Idee? 😮

    scanf ist wohl die maechtigste Einlesefunktion der Standardbibliothek und kann leicht mit diesem Fall umgehen:

    char pfad[4001];
    scanf(" %4000[^\n]", pfad);
    

    Kuerzt so sogar ueberfluessigen Whitespace am Anfang.



  • Nochmal zu deinem ursprünglichen Post:

    strtok verändert den String. Es schreibt an die Stellen von den Trennzeichen eine '\0'.

    Zudem gibt es den Zeiger auf die nächste gefundene Stelle zurück.
    Darum geht dir die Adresse auf den Speicher verloren, den du mit malloc besorgt hast.
    path zeigt dann woanders hin.

    Arrays (und somit auch C-Strings) kann man nicht mit = kopieren.


Log in to reply