2013-07-29 17 views
12

Jaki jest poprawny sposób korzystania z cin.fail();?Prawidłowy sposób korzystania z cin.fail()

Tworzę program, w którym musisz coś wpisać. Nie jest jasne, czy musisz wprowadzić liczbę lub znak. Kiedy użytkownik wprowadza znak zamiast numeru, konsola oszaleje. Jak mogę to naprawić za pomocą cin.fail()?

A może jest lepszy sposób?

+3

Pokaż swój kod. –

+0

@ Shumail92 Obecnie go nie mam. –

+0

W takiej sytuacji zwykle czytałeś postać, a następnie sprawdzałeś, czy jest to cyfra (a jeśli tak, to przekonwertuj ją na liczbę). –

Odpowiedz

6

cin.fail() Zwraca TRUE jeśli ostatnie polecenie cin nie powiodła się, a false w przeciwnym wypadku.

Przykładem

int main() { 

int i, j = 0; 

while (1) { 
    i++; 
    cin >> j; 
    if (cin.fail()) return 0; 
    cout << "Integer " << i << ": " << j << endl; 
} 
} 

Teraz załóżmy, że masz plik tekstowy - input.txt i jego zawartość:

30 40 50 60 70 -100 Fred 99 88 77 66 

Kiedy trafisz powyżej krótki program o tym, jak będzie to skutkować :

Integer 1: 30 
    Integer 2: 40 
    Integer 3: 50 
    Integer 4: 60 
    Integer 5: 70 
    Integer 6: -100 

to nie będzie kontynuować po szóstej wartości po jej zamknięciu po przeczytaniu siódmej słowo, ponieważ nie jest to liczba całkowita: cin.fail() posiada true.

+3

return 0 zazwyczaj oznacza brak błędu. – hetepeperfan

+1

@hetepeperfan mówiąc liczbowo 0 jest jedyną fałszywą wartością. – Borgleader

+0

Tak, ale będzie działać w tej sytuacji - edytowałem odpowiedź i dodałem również 'int main()'. –

11

std::cin.fail() służy do sprawdzenia, czy poprzednie wejście powiodło się. Jest jednak bardziej idiomatyczne po prostu użyć strumienia jakby to była logiczna:

if (std::cin) { 
    // last input succeeded, i.e. !std::cin.fail() 
} 

if (!std::cin) { 
    // last input failed, i.e. std::cin.fail() 
} 

w kontekstach, gdzie składnia pozwoleniu wejściowego albo liczby o charakterze, zwykle rozwiązaniem jest, aby przeczytać it liniami (lub w jakiś inny ciąg znaków) i parsuj go; Gdy wykryjesz, że jest liczbą, możesz użyć konwersji std::istringstream na lub dowolną liczbę innych opcji (strtol lub std::stoi, jeśli masz C++ 11).

Jest jednak możliwe, aby wyodrębnić dane bezpośrednio ze strumienia :

bool isNumeric; 
std::string stringValue; 
double numericValue; 
if (std::cin >> numericValue) { 
    isNumeric = true; 
} else { 
    isNumeric = false; 
    std::cin.clear(); 
    if (!(std::cin >> stringValue)) { 
     // Shouldn't get here. 
    } 
} 
+0

Okay, nigdy nie wiedziałem, że to możliwe. Dziękuję Ci! –

Powiązane problemy