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

zabezpieczenie programu przed wprowadzeniem złych danych

Ostatnio zmodyfikowano 2016-01-10 10:10
Autor Wiadomość
sebek0990
Temat założony przez niniejszego użytkownika
zabezpieczenie programu przed wprowadzeniem złych danych
» 2016-01-09 07:21:12
Witam. Wiem że takich tematów jest dużo ale mój jest wyjątkowy.
Programuję po linuxem. Wiem jak zabezpieczyć program przed wpisaniem znaku do integera jednak pod linuxem mi to nie działa.
dla przykładu mam taki kod

    int i;
    while(!(cin>>i))
    {
        cin.clear();
        cin.sync();
    };
    cout << "done";

nie działa on tak jak trzeba ponieważ po wpisaniu najpierw znaku a potem liczby, program nie wychodzi z pętli.
inny przykład

int main()
{
    int i;
    cin >> i;
    while(cin.fail())
    {
        cout << "error";
        cin >> i;
    }
}

to z kolei wyświetla napis error w nieskonczoność. podobnie z ifami (np. if(cin.fail()){cout << "error"; cin >> i;}
nie wiem co jest nie tak.
Jest jakiś sposób żeby użyskać jakieś bardziej szczegółowe informacje od kompilatora/debuggera dlaczego nie chce wyjść z pętli?
pozdrawiam.
P-143157
carlosmay
» 2016-01-09 10:13:28
C/C++
std::cin.ignore();
 W drugim przekładzie też trzeba czyścić strumień.
Po błędnych danych strumień wejściowy jest wstanie błędu i nie pozwoli
nic wczytać póki nie będzie skasowana flaga błędu.
P-143166
mateczek
» 2016-01-09 10:15:38
http://cpp0x.pl/forum/temat/​?id=12038&p=2 zobacz wpis Monika90

Pod linux jest jakiś błąd !!! dziwnie się strumień zachowuje jak go po błędzie nie wyczyścisz !!!
P-143167
sebek0990
Temat założony przez niniejszego użytkownika
» 2016-01-10 07:01:10
@carlosmay
dzięki działa, ale do pierwszzego przykładu.
pozdrawiam cieplutko.
P-143252
carlosmay
» 2016-01-10 10:10:02
W drugim jest podobnie.
cin.fail() wyłapuje błąd.
Zaraz po wejściu w pętlę stosujesz cin.clear(); cin.ignore()
Następnie ponownie pobierasz od użytkownika dane.

Jeśli ten sposób nie zadziała sugeruję uważnie przeczytać temat z linka
podanego wcześniej.
P-143254
« 1 »
  Strona 1 z 1