Como han dicho otros, comparando con "exit"
está fallando debido a fgets()
incluido el salto de línea en el búfer. Una de sus garantías es que el búfer terminará con una nueva línea, a menos que la línea ingresada sea demasiado larga para el búfer, en cuyo caso no termina con una nueva línea. fgets()
también garantiza que el búfer está terminado nulo, por lo que no necesita cero 256 bytes, pero solo deje que fgets()
use 255 para obtener esa garantía.
La respuesta fácil de comparar exactamente a "exit\n"
requiere que el usuario no agregue accidentalmente espacios en blanco antes o después de la palabra. Eso puede no importar si desea forzar al usuario a tener cuidado con el comando salir, pero podría ser una fuente de molestia para el usuario en general.
El uso de strncmp()
permite "exited"
, "exit42"
, y más para que coincida con los que no desee. Eso podría funcionar en su contra, especialmente si algunos comandos válidos son cadenas de prefijo de otros comandos válidos.
En el caso general, a menudo es una buena idea separar la E/S, la tokenización, el análisis sintáctico y la acción en sus propias fases.
Eso es bueno a menos que el usuario escriba un espacio antes o después de salir.Y no olvide la historia (probablemente apócrifa) del sistema que dejó de funcionar cuando se agregó Ecuador, la gente tuvo que escribir Quito por el nombre de la capital y el programa salió (se cerró) porque solo se compararon las primeras 4 letras con 'dejar'. Muy desagradable! –
@Jonathan truths! Mi propia sugerencia es garantizar que el usuario nunca pueda ingresar nada en su programa. – poundifdef