Come altri hanno già detto, confrontando con "exit"
non riesce a causa fgets()
incluso il newline nel buffer. Una delle sue garanzie è che il buffer terminerà con una nuova riga, a meno che la riga immessa non sia troppo lunga per il buffer, nel qual caso non termina con una nuova riga. fgets()
garantisce inoltre che il buffer non sia terminato, quindi non è necessario azzerare 256 byte ma solo lasciare che fgets()
utilizzi 255 per ottenere tale garanzia.
La semplice risposta del confronto a esattamente "exit\n"
richiedeva che l'utente non aggiungesse accidentalmente spazi bianchi prima o dopo la parola. Ciò potrebbe non avere importanza se si desidera forzare l'utente a fare attenzione con il comando di uscita, ma in generale potrebbe essere una fonte di disturbo dell'utente.
L'utilizzo di strncmp()
utilizza potenzialmente "exited"
, "exit42"
e altro per corrispondere a dove potresti non volere. Potrebbe funzionare contro di te, specialmente se alcuni comandi validi sono stringhe di prefisso di altri comandi validi.
Nel caso generale, è spesso una buona idea separare I/O, tokenizzazione, analisi e azione nelle proprie fasi.
Questo va bene a meno che l'utente non digiti uno spazio prima o dopo, esci.E non dimenticare la storia (probabilmente apocrifa) del sistema che ha smesso di funzionare quando è stato aggiunto l'Ecuador - la gente ha dovuto digitare Quito per il nome della capitale, e il programma è uscito (esci) perché solo le prime 4 lettere sono state confrontate con 'smettere'. Abbastanza cattivo –
@Jonathan verità! il mio suggerimento è di garantire che l'utente non sia mai autorizzato a inserire qualcosa nel tuo programma. – poundifdef