strcmp() zwischen strtok() erzeugtem String und einem Normalen, seltsames Ergebnis



  • Hallo zusammen,

    Ich soll für die Uni eine kleine Shell schreiben. Allerdings scheitere ich momentan am Zerlegen der Eingabe. Ich habe mich ein bisschen mit strtok() beschäftigt, allerdings verstehe ich die Ausgabe von folgendem Code nicht.

    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <signal.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    
    #define INPUT_MAX 100
    
    void get_params(char* input, char** params)
    {
        char *ptr;
        char cpy[INPUT_MAX];
        strcpy(cpy, input);
        int i = 0;
        ptr = strtok(cpy, "\t\n ");
    
        while(ptr != NULL) {
            params[i] = ptr;
            printf("");
            i++;
            ptr = strtok(NULL, "\t\n ");
        }
        params[i] = NULL;
    }
    
    int main(void)
    {
        char* input = "ls -l -21321";
        char* dest[40];
        get_params(input, dest);
        int i;
        char* argh = "ls";
        printf("%d\n", argh[0] == dest[0][0]); //1
        printf("%d\n", argh[1] == dest[0][1]); //1
        printf("%d\n", argh[2] == dest[0][2]); //1
        printf("%d\n", argh[3] == dest[0][3]); //1
        printf("%d\n", strncmp(argh, dest[0],1)); //108
        printf("%d\n", strncmp(argh, dest[0],2)); //108
        printf("%d\n", strcmp(argh, dest[0])); //108
        return 0;
    }
    

    Ich verstehe halt nicht warum zwar die einzelnen Buchstaben gleich sind, aber bei dem strncmp() und dem strcmp() Vergleich ein Unterschied ergibt.



  • Du gibst da Zeiger auf lokale Variablen zurück. cpy ist lokal, strtok gibt Zeiger in cpy zurück, und die packst du dann in param bzw. dest. In main erwartest du dann, dass die Einträge von dest noch irgendwie sinnvoll sind.
    Ich weiß nicht, ob das genau deine Ausgabe erklärt, aber es ist auf jeden Fall falsch.



  • Ein guter Grund sich zu schämen 😉
    Du hast recht, hab die Funktion umgeschrieben und voila die Ergebnisse stimmen mit meinen Erwartungen überein.

    Danke dir


Log in to reply