Perché ottengo un ciclo infinito se inserisco una lettera anziché un numero?

Sto scrivendo questo codice per un compito a casa (basta avviare C ++ quindi per favore andate piano). Abbiamo appena iniziato mentre, fai-da-te e per i loop di oggi. Il programma funziona bene, tranne per il fatto che se si immette una lettera quando il programma richiede un numero intero, il ciclo viene ripetuto all’infinito. Cosa sta succedendo? (Codice sotto) *** EDIT: per chiarire, la parte che è in loop è: “Il numero che hai inserito è negativo. Inserisci un numero positivo per continuare.” Ma all’utente non è data la possibilità di inserire un altro numero. Continua a stampare questo.

#include  using namespace std; int main ( ) { //define variables int num1, num2, total; char answer1; do { //user enters a number cout <> num1; //check that the given num1 value is positive while (num1 < 0) { cout <> num1; } cout <= num2) { total = total + num2; num2 ++; } //tell the user the sum cout << "The total of all the integers\nfrom 1 to " << num1 << " is: \n"; cout << total; //ask if the user wants to try again cout <> answer1; } while (answer1 == 'y'); cout << endl; return 0; } 

Ecco come funziona basic_istream . Nel tuo caso quando cin >> num1 riceve input errati – viene impostato failbit e cin non viene cancellato. Quindi la prossima volta sarà lo stesso input sbagliato. Per gestirlo correttamente è ansible aggiungere un controllo per l’input corretto e cancellare e ignorare cin in caso di input errato. Per esempio:

  #include //user enters a number cout << "\nPlease enter a positive number and press Enter: \n"; do { while(!(cin >> num1)) { cout << "Incorrect input. Please try again.\n"; cin.clear(); cin.ignore(numeric_limits::max(), '\n'); } if(num1 < 0) cout << "The number you entered is negative. Please enter a positive number to continue.\n"; } while(num1 < 0); 

Quando si inserisce una lettera, viene impostato lo stato di errore di cin e non saranno più possibili ulteriori input prima di chiamare cin.clear() . Di conseguenza, l’istruzione cin >> num1 non cambierà il valore di num1 e il ciclo si interromperà per sempre.

Prova questo:

  while (num1 < 0) { cout << "The number you entered is negative.\nPlease enter a positive number to continue.\n"; cin.clear(); cin >> num1; } 

MODIFICARE:

Grazie a Lightness per averlo indicato. Dovresti inizializzare anche num1 :

 int num1=-1, num2, total; 

Questa risposta dovrebbe risolvere il tuo problema. Fondamentalmente stai provando a leggere un carattere dallo stream e non può essere analizzato ad un int, quindi lo stream viene lasciato in uno stato di errore.

Si dovrebbe verificare un errore, cancellarlo e reactjs di conseguenza.

È ansible utilizzare un tipo di dati “char” come input dall’utente, quindi utilizzare “static_cast (” nome variabile “);

 char input; int choose; cin >> input; choose = static_cast(choose) - 48;///then use 'if' statement with the variable 'choose'