Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Walidacja danych, problem z cin.ignore

Ostatnio zmodyfikowano 2017-12-11 14:57
Autor Wiadomość
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

C/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;
   
}
P-167799
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.
P-167801
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
P-167803
« 1 »
  Strona 1 z 1