come convalido l’input dell’utente come un doppio in C ++?

Come dovrei controllare se l’input è davvero un doppio?

double x; while (1) { cout <'; if (cin >> x) { // valid number break; } else { // not a valid number cout << "Invalid Input! Please input a numerical value." << endl; } } //do other stuff... 

Il codice sopra riportato emette infinitamente l’ Invalid Input! dichiarazione, quindi non richiede un altro input. Voglio richiedere l’input, controllare se è legittimo … se è un doppio, vai avanti … se NON è un doppio, richiedi di nuovo.

Qualche idea?

Prova questo:

 while (1) { if (cin >> x) { // valid number break; } else { // not a valid number cout << "Invalid Input! Please input a numerical value." << endl; cin.clear(); while (cin.get() != '\n') ; // empty loop } } 

Questo in sostanza cancella lo stato di errore, quindi legge e scarta tutto ciò che è stato inserito nella riga precedente.

failbit verrà impostato dopo l’utilizzo di un operatore di estrazione in caso di errore di analisi, ci sono un paio di funzioni di test semplici e fail riescono a controllare. Sono esattamente l’opposto l’uno dell’altro perché gestiscono diversamente l’ eofbit , ma questo non è un problema in questo esempio.

Quindi, è necessario cancellare il failbit prima di riprovare.

Come dice casablanca, devi anche scartare i dati non numerici rimasti nel buffer di input.

Così:

 double x; while (1) { cout << '>'; cin >> x; if (cin.good()) // valid number break; } else { // not a valid number cout << "Invalid Input! Please input a numerical value." << endl; cin.clear(); cin.ignore(100000, '\n'); } } //do other stuff... 

Un modo è controllare l’uguaglianza dei numeri fluttuanti.

 double x; while (1) { cout << '>'; cin >> x; if (x != int(x)) { // valid number break; } else { // not a valid number cout << "Invalid Input! Please input a numerical value." << endl; } } 
 #include  #include  bool askForDouble(char const *question, double &ret) { using namespace std; while(true) { cout << question << flush; cin >> ret; if(cin.good()) { return true; } if(cin.eof()) { return false; } // (cin.fail() || cin.bad()) is true here cin.clear(); // clear state flags string dummy; cin >> dummy; // discard a word } } int main() { double x; if(askForDouble("Give me a floating point number! ",x)) { std::cout << "The double of it is: " << (x*2) << std::endl; } else { std::cerr << "END OF INPUT" << std::endl; } return 0; } 
 bool is_double(double val) { bool answer; double chk; int double_equl = 0; double strdouble = 0.0; strdouble = val; double_equl = (int)val; chk = double_equl / strdouble; if (chk == 1.00) { answer = false; // val is integer return answer; } else { answer = true; // val is double return answer; } } 

Vorrei usare scanf invece di cin .

La funzione scanf restituirà il numero di corrispondenze dalla stringa di destinazione. Per assicurarsi che sia stato analizzato un doppio valido, assicurati che il valore di ritorno di scanf sia 1.

Modificare:
Modificato fscanf per scanf .