Wie bereits gesagt wurde, mit "exit"
Vergleich fehlschlägt, weil fgets()
die Neue-Zeile in dem Puffer enthalten. Eine der Garantien ist, dass der Puffer mit einem Newline endet, es sei denn, die eingegebene Zeile ist zu lang für den Puffer, in diesem Fall endet es nicht mit einem Newline. fgets()
auch garantieren, dass der Puffer null terminiert ist, so müssen Sie nicht 256 Bytes Null, sondern nur fgets()
255 verwenden, um diese Garantie zu erhalten.
Die einfache Antwort des Vergleichens mit genau "exit\n"
erforderte, dass der Benutzer vor oder nach dem Wort nicht zufällig Whitespace hinzugefügt. Das kann nicht von Bedeutung sein, wenn Sie den Benutzer zwingen möchten, mit dem Befehl exit vorsichtig zu sein, aber im Allgemeinen eine Quelle der Benutzerbelästigung sein könnte.
Die Verwendung von strncmp()
ermöglicht möglicherweise "exited"
, "exit42"
und mehr, um zu entsprechen, wo Sie sie möglicherweise nicht möchten. Das kann gegen Sie arbeiten, besonders wenn einige gültige Befehle Präfix-Strings anderer gültiger Befehle sind.
Im allgemeinen Fall ist es oft eine gute Idee, I/O, Tokenization, Parsing und Aktion in ihre eigenen Phasen zu trennen.
Das ist gut, es sei denn, der Benutzer gibt ein Leerzeichen vor oder nach dem Beenden ein.Und vergessen Sie nicht die (wahrscheinlich apokryphe) Geschichte des Systems, das nicht mehr funktionierte, als Ecuador hinzugefügt wurde - die Leute mussten Quito für den Namen der Hauptstadt eingeben, und das Programm wurde beendet, weil nur die ersten 4 Buchstaben verglichen wurden 'Verlassen'. Ziemlich böse! –
@ Jonathan Wahrheiten! Mein eigener Vorschlag besteht darin, sicherzustellen, dass der Benutzer niemals etwas in sein Programm eingeben darf. – poundifdef