2013-06-05 4 views
5

Ho provato a richiedere all'utente l'input e a effettuare la convalida. Ad esempio, il mio programma deve contenere 3 input utente. Una volta che non ha numero intero, stamperà un messaggio di errore e richiederà di nuovo l'input. Ecco come il mio programma sta per essere simile a quando l'esecuzione:Convalida numero intero per input

Inserire il numero: un

ingresso sbagliato

Inserire il numero: 1

Inserire il numero di: b

sbagliato input

Inserire numero: 2

Inserisci numero: 3

numeri inseriti sono 1,2,3

E qui è il mio codice:

double read_input() 
{ 
    double input; 
    bool valid = true; 
    cout << "Enter number: " ; 
    while(valid){ 
     cin >> input; 
     if(cin.fail()) 
     { 
      valid = false; 
     } 
    } 
    return input; 
} 

mio metodo principale:

int main() 
{ 
double x = read_input(); 
double y = read_input(); 
double z = read_input(); 
} 

Quando il mio il primo input non è intero, il programma esce solo da solo. Non chiede di nuovo il prompt. Come ho potuto ripararlo? O dovrei usare un ciclo while mentre chiedo l'input dell'utente.

Grazie in anticipo.

+0

dobbiamo vedere più codice .. lo hai controllato con un debugger? potrebbe essere un crash ... –

+0

all'interno del metodo principale, scrivo solo double x = read_input(); double y = read_input(); double z = read_input(); Sto facendo nel modo sbagliato? –

risposta

7

Quando la lettura non riesce, è possibile impostare valid-false, quindi la condizione nel ciclo while è false e il programma ritorna input (che non è inizializzata, tra l'altro).

si hanno anche per svuotare il buffer prima di usarlo di nuovo, qualcosa di simile a:

#include <iostream> 
#include <limits> 

using namespace std; 

double read_input() 
{ 
    double input = -1; 
    bool valid= false; 
    do 
    { 
     cout << "Enter a number: " << flush; 
     cin >> input; 
     if (cin.good()) 
     { 
      //everything went well, we'll get out of the loop and return the value 
      valid = true; 
     } 
     else 
     { 
      //something went wrong, we reset the buffer's state to good 
      cin.clear(); 
      //and empty it 
      cin.ignore(numeric_limits<streamsize>::max(),'\n'); 
      cout << "Invalid input; please re-enter." << endl; 
     } 
    } while (!valid); 

    return (input); 
} 
+0

Quando ho inserito un cout in un'altra istruzione e ho digitato non-integer, il messaggio di errore continua a ripetere il ciclo. –

+0

Non riesco a testare il codice, ma Ideone ha lo stesso risultato, fammi controllare perché. – Djon

+0

@Carol Funziona ora, suppongo che fosse l'ordine tra 'clear' e' ignore': http://ideone.com/fl4IMK – Djon

0

La tua domanda ha farmi in altre questioni, come compensazione del cin sul fail() -

double read_input() 
{ 
double input; 
int count = 0; 
bool valid = true; 
while(count != 3) { 
    cout << "Enter number: " ; 
    //cin.ignore(); 
    cin >> input; 
    if(cin.fail()) 
    { 
     cout << "Wrong Input" <<endl; 
     cin.clear(); 
     cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    } 
    else 
      count++; 
} 
return input; 
} 
0

il problema è nella condizione, mentre

bool valid = true; 
while(valid){ 

è ciclo fino ad ottenere un ingresso non valida, questo abs ollyly non quello che vuoi! condizione del ciclo dovrebbe essere così

bool valid = false; 
while(! valid){ // repeat as long as the input is not valid 

Qui è una versione modificata del vostro read_double

double read_input() 
{ 
    double input; 
    bool valid = false; 
    while(! valid){ // repeat as long as the input is not valid 
     cout << "Enter number: " ; 
     cin >> input; 
     if(cin.fail()) 
     { 
      cout << "Wrong input" << endl; 

      // clear error flags 
      cin.clear(); 
      // Wrong input remains on the stream, so you need to get rid of it 
      cin.ignore(INT_MAX, '\n'); 
     } 
     else 
     { 
      valid = true; 
     } 
    } 
    return input; 
} 

E nel vostro principale che devi chiedere doppie maggio come si vuole, ad esempio

int main() 
{ 
    double d1 = read_input(); 
    double d2 = read_input(); 
    double d3 = read_input(); 

    cout << "Numbers entered are: " << d1 << ", " << d2 << ", " << d3 << endl; 

    return 0; 
} 

Si potrebbe anche voler avere un ciclo in cui si chiama read_double() e salvare i valori restituiti in una matrice.

+0

Ok grazie molte. Ho usato cin.clear() e getline in un'altra istruzione e ora funziona –