Passwort-Abfrage(String einlesen)



  • /* string8.c */
    
    #include <stdio.h>
    #include <stdlib.h>
    
    const char p[]= { "123xyz456" };
    
    int check_passwort(char passw[])           
    {                                                                           
        int i, n = sizeof(p) / sizeof(char);
    
        for(i=0; i < n; i++)
            if(passw[i] != p[i])
                return 0;
        return 1;
    }
    
    int main(void)
    {
        char Name[20], passwort[10];
        printf("Login-Name : ");
        fgets(Name, 20, stdin);
        printf("Passwort   : ");
        fgets(passwort, 10, stdin);
    
        if(check_passwort(passwort) == 1)
            printf("Willkommen im System %s\n", Name);
        else
            printf("Falsches Passwort! Systemzugriff verweigert.\n");
        return EXIT_SUCCESS;
    }
    

    Dort kapiere ich die Funktion check_passwort nicht ganz, zumindest folgende Zeile ist mir schleierhaft:

    int i, n = sizeof(p) / sizeof(char);
    

    Was geht hier vor?



  • i wird definiert, n wird definiert und bekommt die Anzahl der Elemente im Array p zugewiesen.
    sizeof(p) ergibt die Größe des Arrays p in Byte, sizeof(char) ergibt die Größe eines Elementes im Array p, ergo ergibt die Division:
    Länge des Arrays in Byte geteilt durch Größe eines Elementes

    als Ergebnis die Anzahl der Elemente.



  • So richtig sinnvoll wird das erst, wenn man sizeof(char) durch sizeof(p[0]) ersetzt. Dann ergibt das nämlich auch dann die Anzahl der Elemente, wenn man den Datentyp des Arrays von char auf irgendeinen anderen, zB int ändern würde.



  • GhostfaceChilla schrieb:

    /* string8.c */
    
    #include <stdio.h>
    #include <stdlib.h>
    
    const char p[]= { "123xyz456" };
    
    int check_passwort(char passw[])           
    {                                                                           
        int i, n = sizeof(p) / sizeof(char);
    
        for(i=0; i < n; i++)
            if(passw[i] != p[i])
                return 0;
        return 1;
    }
    
    int main(void)
    {
        char Name[20], passwort[10];
        printf("Login-Name : ");
        fgets(Name, 20, stdin);
        printf("Passwort   : ");
        fgets(passwort, 10, stdin);
    
        if(check_passwort(passwort) == 1)
            printf("Willkommen im System %s\n", Name);
        else
            printf("Falsches Passwort! Systemzugriff verweigert.\n");
        return EXIT_SUCCESS;
    }
    

    Dort kapiere ich die Funktion check_passwort nicht ganz, zumindest folgende Zeile ist mir schleierhaft:

    int i, n = sizeof(p) / sizeof(char);
    

    Was geht hier vor?

    Die n Berechnung wird falsch, sobald man p von const char[] in const char* definiert, außerdem ist hier

    const char p[]= { "123xyz456" };
    

    ebenso Unfug (hier aber ausnahmsweise ohne fehlerhafte Auswirkungen), richtig ist

    const char p[]= "123xyz456";
    

    Statt des Unfugs ist das dem Autor wohl unbekannte #include <string.h> besser:

    int check_passwort(const char *passw)           
    {                                                                           
        return !strcmp(p,passw);
    }
    


  • Ok, dabke schonmal aber ich kapier des mit dieser Rechnung noch immer nicht ??

    int i, n = sizeof(p) / sizeof(char);
    

    So also sizeof(p) bezieht sich ja auf das:

    const char p[]= { "123xyz456"};
    

    Aber auf was bezieht sich sizeof(char)??

    Danke nochmals 😉



  • Auf den Datentyp char.
    sizeof(char) -> meist 1
    sizeof(int) -> meist 4
    sizeof(short) > meist 2

    usw.



  • Ok, aber ich meine wo im Quellcode bezieht sich sizeof(char) drauf^^
    Und was bringt mir das Ergebnis ....



  • Belli schrieb:

    Auf den Datentyp char.
    sizeof(char) -> meist 1

    Per Definition immer 1.



  • Was meinst du mit 1??^^



  • 1 Byte.

    Und was bringt mir das Ergebnis ....

    Hat dir Belli in der ersten Antwort schön erklärt.



  • Also würde es dann so sein, das sizeof(p)= 9 und sizeof(char) = 1 ?
    Wäre aber unnötig durch 1 zu teilen oder?^^



  • In diesem konkreten Fall, ja!
    Wie in meiner ersten Antwort erklärt, sollte da auch eher sizeof(p[0]) statt sizeof(char) stehen, damit wird das Ganze ein wenig flexibler.
    Solange Du aber weißt, daß p ein Array vom Typ char ist, ist sizeof(p) identisch mit der Anzahl der in p gespeicherten char's.


Anmelden zum Antworten