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