Problem mit getchar

gets macht das ja auch nicht.
fgets ist da etwas anders.
Aber wie gesagt, gets ist ein permanentes Risiko: Wenn der Benutzer mehr eingibt, als im String Platz ist, kannst du dagegen gar nichts tun.

Zu den dann (nach Lust und Laune) zufällig/unvorhersagbar auftretenden Fehlern zählen Abstürze, eigenständige Änderung von Variablenwerten...
Mit etwas Pech ändert sich auch der Codeteil und dein Programm macht plötzlich was anderes, als es laut Quelltext eigentlich machen sollte.
 
ok! wenn ich nun bei meinem Programm eine 23 ziffrige Zahl eingebe wird ja laut Funktion der letzte Zeilenumbruch durch \0 (an Stelle 23 im Array) ersetzt- wird die überstehende, nicht mehr in das Array passende \0 nicht von getchar als störend empfunden? in diesem Fall greift "else{while(fgetc(stdin) != '\n');}" doch nicht mehr

denn das war doch das Problem bei scanf, oder? die \0 steht über wird von getchar() eingelesen
 
Das Problem bei scanf war eher der Zeilenwechsel, weil der für scanf als Entertaste=Eingabe fertig gesehen wird.
Allerdings verwechselst du was: Das \0 ist nur nach dem Einlesen im char-Array die Begrenzung.
Der Input, den fgets von der Tastatur (bzw irgendwas dazwischen) bekommt, hat keine \0.
Nur die Buchstaben und ein \n.

Wenn man fgets jetzt 24 Buchstaben als Maximallänge gibt, holt es sich so lange welche rein, bis es 23 sind (Arrayindex 0-22) oder ein \n dabei ist.
Danach wird noch die \0 in das char-Array geschrieben. Spätestens am Index 23, und damit ist alles in Ordnung.

Zu deiner 23-Stelligen Zahl:
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 \n
Macht im Tastaturspeicher 24 Stellen.
fgets, Maximal 24, holt sich 23. Das \n nicht mehr.
Char-Array:
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 ?
Zum Schluss noch ein \0:
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 \0
Gut. Nichts steht über das Ende des Arrays raus, und ein \n wartet noch im Tastaturspeicher. Kein \0.

Gruß
 
Ok, dass sich fgets (bei 24 maximal) immer nur 23 holt und die 24. Stelle für die binäre 0 reserviert beim Schreiben ins Array war mir noch nicht so klar geworden - danke.

das leuchtet dann auch alles ein, die \n würde übrig bleiben und da (if..) nicht greift mit Hilfe von else{while(fgetc(stdin) != '\n');} abgerbeitet.

Edit: Damit ist die Sache für mich abgeschlossen; eine schwere Geburt, danke für die Ausdauer ;)
 
Zurück