2013-06-05 20 views
5

Próbowałem monitować użytkownika o wprowadzenie danych i przeprowadzić sprawdzanie poprawności. Na przykład mój program musi przyjąć 3 dane wejściowe użytkownika. Po osiągnięciu wartości niecałkowitej, wyświetli komunikat o błędzie i ponownie poprosi o wprowadzenie danych. Oto jak mój program będzie wyglądać, gdy uruchomiony:Walidacja liczb całkowitych dla danych wejściowych

Wprowadź numer: a

błędne wprowadzanie

Wprowadź numer: 1

Wprowadź numer: b

Niewłaściwy input

Wprowadź numer: 2

Wprowadź numer: 3

Numery wpisane są 1,2,3

I tu jest mój kod:

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

Moim głównym metoda:

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

kiedy mój pierwsze wejście nie jest liczbą całkowitą, program po prostu wychodzi samoczynnie. Nie prosi o ponowne zapytanie. Jak mogłem to naprawić? Czy powinienem użyć pętli do while, ponieważ pytam o dane wejściowe użytkownika.

Z góry dziękuję.

+0

musimy zobaczyć więcej kodu ... czy sprawdziłeś go za pomocą debuggera? może być crash ... –

+0

wewnątrz głównej metody Właśnie napisałem double x = read_input(); double y = read_input(); double z = read_input(); Czy robię złą drogę? –

Odpowiedz

7

Kiedy odczyt nie powiedzie się, można ustawić valid do false, więc warunek w pętli while jest false a program powraca input (co nie jest zainicjowany, przy okazji).

Trzeba też opróżnić bufor przed użyciem go ponownie, coś jak:

#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

Kiedy umieszczam cout w instrukcji else i wpisałem niecałkowitą, sam komunikat o błędzie po prostu zapętla się. –

+0

Nie mogę przetestować kodu, ale Ideone ma takie same wyniki, pozwól mi sprawdzić, dlaczego. – Djon

+0

@ Carol To działa teraz, myślę, że to była kolejność pomiędzy 'clear' i' ignore': http://ideone.com/fl4IMK – Djon

0

Twoje pytanie nie dostać się do innych kwestii, jak wyczyszczenie CIN na 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

problem jest w stanie while

bool valid = true; 
while(valid){ 

ty pętli, aż pojawi się non ważny wkład, to abs olutly nie to, co chcesz! warunek pętli powinny być jak ten

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

Oto zmodyfikowaną wersję swojego 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; 
} 

A w głównym trzeba prosić, ponieważ może służyć jako chcesz, na przykład

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

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

    return 0; 
} 

Możesz także chcieć utworzyć pętlę, w której wywołasz read_double() i zapiszesz zwrócone wartości w tablicy.

+0

Dobrze dziękuję. Użyłem cin.clear() i getline in else statement i działa teraz –

Powiązane problemy