2010-01-16 16 views
13

Jestem w mojej drugiej klasie OOP, a moja pierwsza klasa była nauczana w języku C#, więc jestem nowy w C++ i obecnie ćwiczę sprawdzanie danych wejściowych przy użyciu cin. Oto moje pytanie:Dobra pętla sprawdzania danych wejściowych przy użyciu cin - C++

Czy ta pętla zbudowała całkiem niezły sposób sprawdzania poprawności danych wejściowych? Czy istnieje bardziej powszechny/akceptowany sposób robienia tego?

Dzięki!

Kod:

int taxableIncome; 
int error; 

// input validation loop 
do 
{ 
    error = 0; 
    cout << "Please enter in your taxable income: "; 
    cin >> taxableIncome; 
    if (cin.fail()) 
    { 
     cout << "Please enter a valid integer" << endl; 
     error = 1; 
     cin.clear(); 
     cin.ignore(80, '\n'); 
    } 
}while(error == 1); 

Odpowiedz

23

Nie jestem wielkim fanem włączanie wyjątków dla iostreams. Błędy we/wy nie są wystarczająco wyjątkowe, ponieważ błędy są często bardzo prawdopodobne. Wolę używać wyjątków tylko w przypadku rzadszych błędów.

Kod nie jest zły, ale pomijanie 80 znaków jest nieco arbitralne, a zmienna błędu nie jest konieczna, jeśli bawisz się z pętlą (i powinno być bool, jeśli ją zachowasz). Możesz odczytywać od cin bezpośrednio do if, co jest prawdopodobnie bardziej idiomem Perla.

Oto moje zdanie:

int taxableIncome; 

for (;;) { 
    cout << "Please enter in your taxable income: "; 
    if (cin >> taxableIncome) { 
     break; 
    } else { 
     cout << "Please enter a valid integer" << endl; 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
    } 
} 

Oprócz omijając tylko 80 znaków, to są tylko drobne zastrzeżenia, i to bardziej kwestia preferowanego stylu.

+0

Dzięki, to jest bardziej zgodne z tym, czego szukałem. Bardzo doceniane. Jedno pytanie jednak, co jest warunkiem pętli for (;;)? Nie rozumiem tego. – Alex

+2

@Alex - 'foo (;;)' oznacza pętlę na zawsze, podobnie jak 'while (1)'. Jeśli nie chcesz, aby twoja pętla naprawdę zapętlała się na zawsze, potrzebujesz 'break' gdzieś w środku, aby zakończyć pętlę. –

+0

W takim przypadku zwykle mam (! Eof (stdin)), aby uniknąć oszalałego kodu, jeśli dane wejściowe zostaną utracone ... lub czy spowoduje to wyjątek? – PypeBros

3

Możecie nie rozważyć try/catch, tak aby można stosować do koncepcji obsługi wyjątków?

Jeśli nie, może użyć wartości boolowskiej, zamiast 0 i 1? Nabierz zwyczaju używania zmiennych odpowiedniego typu (oraz tworzenia typów, gdzie to konieczne)

Cin.fail() jest również omawiany na http://www.cplusplus.com/forum/beginner/2957/

W rzeczywistości, w wielu miejscach ...

http://www.google.com.sg/#hl=en&source=hp&q=c%2B%2B+tutorial&btnG=Google+Search&meta=&aq=f&oq=c%2B%2B+tutorial

możesz uczyć się niektórych z nich i starać się postępować zgodnie z wytycznymi, dlaczego rzeczy powinny być wykonywane w określony sposób.

Ale prędzej czy później, powinieneś zrozumieć wyjątki ...

2

Jedno drobne zastrzeżenie jest to, że zmienna błąd pomocnik jest całkowicie zbędne i nie jest konieczna:

do 
{ 
    cin.clear(); 
    cout << "Please enter in your taxable income: "; 
    cin >> taxableIncome; 
    if (cin.fail()) 
    { 
     cout << "Please enter a valid integer" << endl; 
     cin.ignore(80, '\n'); 
    } 
}while(cin.fail()); 
4
int taxableIncome; 
string strInput = ""; 
cout << "Please enter in your taxable income:\n"; 

while (true) 
{ 
    getline(cin, strInput); 

    // This code converts from string to number safely. 
    stringstream myStream(strInput); 
    if ((myStream >> taxableIncome)) 
     break; 
    cout << "Invalid input, please try again" << endl; 
} 

Więc widać używam ciąg na wejściu, a następnie przekonwertować na liczbę całkowitą. W ten sposób ktoś mógłby wpisać enter, "mickey mouse" lub cokolwiek innego i nadal będzie odpowiadać.
Również #include <string> i <sstream>

Powiązane problemy