Walidacja danych, problem z cin.ignore
Ostatnio zmodyfikowano 2017-12-11 14:57
aerocell Temat założony przez niniejszego użytkownika |
Walidacja danych, problem z cin.ignore » 2017-12-11 14:16:17 Hej, mam problem z walidacją danych, a dokładniej funkcji cin.ignore. Może zamiast tłumaczyć, to wkleję kawałek kodu i powiem tyle, że nie działa. Cały czas jest w pierwszej pętli do..while, cokolwiek bym nie wpisał, nie chce z niej wyjść. Próbowałem: - w pierwszej pętli dodać warunek cin.good() - zamiast użycia numeric_limits wpisać po prostu liczbę (1000) - zmieniać warunki (while (cin.fail()) - zdefiniowac wybor = 0 (1 i 2 tez) Ale nic nie działa. Nie chce używać cin.sync, wolę używać cin.ignore, który jest bardziej uniwersalny (cin.sync nie testowałem jak coś). Zapewne odpowiedź jest banalna i tego nie widzę, no ale się przecież uczę :c void Ustawienia( char & znak, int & rozmiar ) { short wybor; do { system( "cls" ); cout << "Chcesz wpisac znak czy kod ASCII? (1 - znak, 2 - ASCII)" << endl; cin >> wybor; if( cin.fail() || wybor != 1 || wybor != 2 ) { cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); } } while( wybor == 1 || wybor == 2 ); if( wybor == 1 ) { cout << "Wpisz znak: "; cin >> znak; } if( wybor == 2 ) { short znak_ascii; cout << "Wpisz kod ASCII: "; cin >> znak_ascii; do { if( cin.fail() ) { cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); } } while( cin.fail() ); znak = char( znak_ascii ); } cout << "Wybrany znak: " << znak; } |
|
YooSy |
» 2017-12-11 14:42:29 Warunki są złe. Np. cin.fail() || wybor != 1 || wybor != 2 będzie zawsze prawdziwy, bo wybór zawsze będzie albo różny od 1, albo różny od 2. Warunek pętli także. |
|
aerocell Temat założony przez niniejszego użytkownika |
» 2017-12-11 14:57:32 //edit Zrobiłem if( cin.fail() ||( wybor != 1 && wybor != 2 ) ) lecz nadal nie działa. Chyba nie do końca rozumiem, gdzie tu jest błąd... Zostawiłem samo cin.fail() i efekt taki sam, zmieniłem wszystkie alternatywy na koniunkcje i nadal to samo. Czy cin.fail() nie zwraca TRUE tylko wtedy, gdy typ danych jest nieprawidłowy? //edit 2 Problem leżał w warunku do..while. Zamieniłem na while( wybor != 1 && wybor != 2 ); I działa |
|
« 1 » |