Un altro problema è che si sta leggendo solo scanf("%f", &input);
. Se l'utente digita qualcosa che non può essere interpretato come un numero in virgola mobile C, come "pi", la chiamata scanf()
non assegnerà nulla a input
e non progredirà da lì. Ciò significa che cercherà di continuare a leggere "pi", e in mancanza.
Data la modifica a while(!feof(stdin))
che altri poster stanno raccomandando correttamente, se si digita "pi" ci sarebbe un ciclo infinito di stampa del valore precedente di input
e la stampa del prompt, ma il programma non elaborerebbe mai alcun nuovo ingresso.
scanf()
restituisce il numero di assegnazioni alle variabili di input effettuate. Se non ha assegnato alcun incarico, significa che non ha trovato un numero a virgola mobile, e dovresti leggere più input con qualcosa come char string[100];scanf("%99s", string);
. Questo rimuoverà la stringa successiva dal flusso di input (fino a 99 caratteri, in ogni caso - l'extra char
è per il terminatore null sulla stringa).
Si sa, questo mi ricorda tutti i motivi per cui odio lo scanf()
, e perché io uso fgets()
invece e quindi forse lo analizzo usando sscanf()
.
fonte
2009-09-15 19:21:21
Nota: Supponendo che l'input dell'utente non viene convogliata, controllando per EOF probabilmente non è l'ideale, dal momento che IIRC di solito questo significa che l'utente deve premere Ctrl + D per smettere, che non è ovvio – Brian