Rozdział 16 problem
Ostatnio zmodyfikowano 2018-03-04 19:04
Robinsoncruzoe Temat założony przez niniejszego użytkownika |
Rozdział 16 problem » 2018-03-04 18:41:19 Dobry wieczór mam mały problem bo siedziałem dosyć długi czas nad tym zadaniem i w końcu wszystko działa, ALE nie do konca rozumiem dzialanie cin.clear cin.sync cin.ignore oraz cin.sync oto mój działający już program: #include <iostream> #include <ctime> #include <cstdlib> #include <conio.h> using namespace std;
int main()
{ srand( time( NULL ) ); int wybrana, wylosowana, i = 0; wylosowana =(( std::rand() % 10 ) + 1 ); bool poprawnosc; do { cin.clear(); cin.sync(); i++; cout << "Podaj liczbe z zakresu 1-10 na ktora obstawiasz" << endl; cin >> wybrana; poprawnosc = cin.fail(); if( poprawnosc == true || wybrana < 1 || wybrana > 10 ) { cout << "Wpisano znak lub liczbe wykraczajaca za zakres." << endl << endl; } if( wybrana != wylosowana && poprawnosc == false && wybrana >= 1 && wybrana <= 10 ) { cout << "Niestety nie udalo Ci sie trafic, sprobuj jeszcze raz" << endl << endl; } } while( wybrana != wylosowana ); cout << "Brawo wygrales termos z kawa!" << endl; cout << "Ilosc prob: " << i; return 0; }
Program nad którym siedziałem bardzo długo bo wywalał się ciągle na wpisaniu litery zamiast liczby a okazało się, że jedyna różnica była taka, że instrukcja: była zapisana odwrotnie czyli: Jeżeli są na odwrót program znowu wywala sie na wpisaniu litery czy jakiegokolwiek innego znaku. Co wiecej po tym jak do tego doszedlem zaczalem eksperymentowac z podmiana instrukcji cin.sync(); na cin.ignore( 100, '\n' ) i nic to nie zmienia program tak samo wywala sie jeżeli instrukcje występują w odwrotnej kolejności, jedyna różnica jest taka że w przypadku użycia ignore lepiej to działa jeżeli instrukcje umieścimy na koncu petli bo w przypadku gdy damy ja na samym poczatku to bedzie trzeba kliknac enter zeby program w ogole ruszyl, ale to mi sie wydaje dosyć oczywiste no bo w koncu kazemy mu pominac te 100 czy ileś tam znaków. Pomijajac juz ten szczegol to najbardziej interesuje mnie to dlaczego kolejnosc tych metod ma znaczenie no i po co w ogole uzywac tej drugiej instrukcji ignore czy sync które jak dobrze rozumiem ignoruja znaki zawarte w buforze wejścia cin (?o ile dobrze rozumiem) jezeli poprzedzajaca ignore/cync metoda clear czysci ten bufor? No jak widać w mojej głowie misz masz także będę wdzięczny za odpowiedź. Pozdrawiam |
|
pekfos |
» 2018-03-04 18:44:42 clear nie czyści bufora, tylko flagi błędów. Jeśli strumień jest w stanie błędu, inne operacje nie działają. |
|
YooSy |
» 2018-03-04 18:47:12 cin.clear() musi być pierwsze, bo resetuje flagi błędów strumienia. Nie można niczego wykonać na zablokowanym strumieniu (w stanie błędu), dlatego cin.sync() nie działało jako pierwsze. Lepiej korzystać z cin.ignore() ponieważ cin.sync() nie służy do opróżniania bufora strumienia wejściowego. To jest tylko efekt uboczny i zależy od implementacji kompilatora. |
|
Robinsoncruzoe Temat założony przez niniejszego użytkownika |
Dziękuję za odpowiedzi » 2018-03-04 19:04:28 Dzięki za obie odpowiedzi, już wszystko jasne i logiczne.
Pozdrawiam |
|
« 1 » |