fgets & Newline-Zeichen & Stringende-Zeichen



  • Hallo kurzes Beispiel:

    #include <stdio.h>
    #include <stdlib.h>
    /*Passwort*/
    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; /* Falsches Passwort */
       return 1;   /* Richtiges Passwort */
    }
    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",Name);
       else
          printf("Falsches Passwort! Systemzugriff verweigert.\n");
          PAUSE;
       return EXIT_SUCCESS;
    }
    

    In "passwort" passen 10 Zeichen rein ist klar.
    Aber fgets hängt doch immer Newline-Zeichen (\n) und Stringende-Zeichen (\0) mit dran also passen in "passwort" nur noch 8 Zeichen rein.
    Aber in p stehen 9 Zeichen (+ \0 = 10).
    Wie ist dann die Passwort überprüfung möglich wenn man als Passwort nur 8 Zeichen eingeben kann?



  • #include <stdlib.h>
    /*Passwort*/
    
    const char p[]=  { '1', '2', '3', 'x', 'y', 'z', '4', '5', '6', '\n', '\0'   };
    
    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; /* Falsches Passwort */
       return 1;   /* Richtiges Passwort */
    }
    
    int main(void) {
       char Name[200], passwort[100];
       printf("Login-Name : ");
       fgets(Name, 200, stdin);
       printf("Passwort   : ");
       fgets(passwort, 100, stdin);
       if( check_passwort(passwort) == 1)
          printf("Willkommen im System %s",Name);
       else
          printf("Falsches Passwort! Systemzugriff verweigert.\n");
          PAUSE;
       return EXIT_SUCCESS;
    }
    

    :xmas1:



  • Wie ist dann die Passwort überprüfung möglich wenn man als Passwort nur 8 Zeichen eingeben kann?

    Ich wollte eine Erklärung und keinen Source.



  • Hat wirklich keiner ne Vernünftige erklärung?



  • fget schrieb:

    Hat wirklich keiner ne Vernünftige erklärung?

    ich verstehe die frage nicht. klar kann man passwörter mit mehr als 8 zeichen haben und einlesen und vergleichen. wo ist das problem überhaupt? warum ist passwort da nur 10 bytes groß?



  • Ok Problem hat sich erledigt.
    Habe da was verkehrt verstanden.
    Aber wie siehts den aus wenn 2 Strings überprüft werden und beide den selben Inhalt habe ausser das bei dem einen das '\n' zeichen fehlt?



  • Ersetze das Newline-Zeichen doch einfach durch ein Terminierungs-Zeichen, z.B. so:

    void remove_newline( char* buffer )
    {
        while( !*buffer )
        {
            if(*buffer == '\n')
            {
                *buffer = 0x00; break;
            }
        }
    }
    
    int main( void )
    {
        char temp[MAX_PATH] = {0};
    
        fgets( temp, MAX_PATH-1, stdin );
        remove_newline( temp );
    
        printf("Tada: %s\n", temp);
    
        return 0;
    }
    


  • sorry für das rauskramen des alten Threads,

    aber was bedeutet das ! in

    while(!*buffer)?



  • NOT, Nicht

    Umkehrung des dahinter stehenden logischen Wertes.
    Aus wahr wird unwahr und umgekehert.

    Da in C unwahr == 0 ist und alles andere wahr, wird also alles andere zu 0 und 0 zu 1.

    (!= ist ja auch "nicht gleich")

    Das Ganze ist eine Kurzschreibweise für while(*buffer != '\0')

    Ein neuer Thread mit dem Code von remove_newline hätte das sorry erspart.



  • DirkB schrieb:

    Das Ganze ist eine Kurzschreibweise für while(*buffer != '\0')

    Das ist genau falsch, denn diese Schreibweise ist die Prüfung
    eines Ausdrucks auf "nicht ungleich 0", also auf "gleich 0"
    und somit die Kurzschreibweise für while(*buffer == '\0')

    Im Sinne der gewünschten Funktionalität müsste es allerdings != sein.
    Es fehlt außerdem noch das Inkrementieren von buffer.



  • Ich sollte nicht vor dem Aufstehen antworten 🙄


Anmelden zum Antworten