• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak działa cin.ignore()?

Object Storage Arubacloud
0 głosów
2,341 wizyt
pytanie zadane 30 czerwca 2019 w C i C++ przez patryk123 Nowicjusz (170 p.)

Mam pytanie, co do cin.ignore(). Mianowicie znalazłem w internecie krótki program (który dołączam do wpisu), w którym jest on użyty, ale nie rozumiem jego działania w nim. Chodzi o to, że kiedy ten cin.ignore się tam znajduje to program działa, ale kiedy go nie ma to nawet po wpisaniu jednego złego znaku do konsoli program szaleje. Dlaczego się tak dzieje? Przecież cin.ignore nie ignoruje pierwszego znaku, który podajemy tylko następne.

 #include <iostream>

int wybor;

using namespace std;
main()
{
 cout<< "Wpisz jakas cyfre";
 while(!(cin >> wybor))
       {
         cin.clear();
         cout << "Wpisales niepoprawny znak, ponow swa operacje";

         cin.ignore(1024, '\n');
       }
       system("pause");
   }

 

2 odpowiedzi

0 głosów
odpowiedź 30 czerwca 2019 przez Chess Szeryf (76,710 p.)
edycja 30 czerwca 2019 przez Chess

Wydaje mi się, że gdybyś użył getline zamiast cin, to wszystko by grało bez ignore.

1. Jeśli wpiszesz jakiś znak pętla wykonuje obrót.

2. Zostają czyszczone wewnętrzne flagi błędów.

3. Zostaje wypisany jakiś tekst.

4. Zostaje zignorowany biały znak - znak nowej linii.

Reasumując, jeśli nie napiszesz instrukcji

cin.ignore(1024, '\n');

, to wtedy do chyba bufora trafi wartość "jakiś tekst\n" i ten warunek (cin >> wybor) będzie zawsze na false (ponieważ do chyba bufora nie trafią dane, czyli tak naprawdę nic nie zostało wpisane w tymże buforze), co po zanegowaniu wykrzyknikiem z przodu zwróci zawsze true. Program, nie będzie miał jak poprosić o nową wartość, ponieważ chyba w buforze wisi poprzednia wartość, która nie została zatwierdzona do przeanalizowania przez program. Wpadamy więc w pętlę nieskończoną.

Dzieje się tak, dlatego że znak nowej linii zatwierdza daną wartość i jest porównywana chyba w buforze (chyba w strumieniu cin). Jeśli jednak nie zatwierdzisz danej wartości np. enter'em (znak nowej linii) - czyli nie zignorowałeś znaku nowej linii, to wtedy warunek pętli będzie zawsze spełniony, bo gdyby znak nowej linii zostałby zignorowany (zostałaby wtedy zatwierdzona wartość), to wtedy wartość w warunku pętli wynosiłaby false, co po zanegowaniu zwróci true - czyli pętla wykonałaby następny obrót, ale bez pętli nieskończonej, bo po tym true w ciele pętli while użytkownik zostałby poproszony o następną wartość do wpisania do chyba bufora.

W skrócie: (bez ignore) - user nie jest proszony o podanie nowej wartości do chyba bufora - powstaje pętla nieskończona;

(z ignore) - user jest proszony o podanie nowej wartości do chyba bufora - nie powstaje pętla nieskończona.

Dla testu można tak napisać:

bool xxx;
// ...
while(xxx = !(cin >> wybor)) {
  cin.clear();
  cout<<xxx;
  //cin.ignore(1024, '\n'); // enable this line and disable later
}
// ...
0 głosów
odpowiedź 30 czerwca 2019 przez Marcin Siniarski Gaduła (4,420 p.)

http://www.cplusplus.com/reference/istream/istream/

Szczerze trochę mi to zajęło, ale raczej już wiem co się dzieje.
Pierwszym błędem jest while(!(cin >> wybor)). Program nie ma szans na wydostanie się z pętli.

  1. Użytkownik wprowadza abcdefg zamast liczby (bo czemu nie)
  2. cin zauważa literę w wejściu, ustawia failbit, nie zmieniając naszej zmiennej ani nie pobierając nic ze strumienia
  3. Zostaje wyczyszczony failbit
  4. Powrót do kroku 2

 

komentarz 1 lipca 2019 przez j23 Mędrzec (194,920 p.)

Pierwszym błędem jest while(!(cin >> wybor)).

Ja tam błędu nie widzę.

Podobne pytania

+1 głos
2 odpowiedzi 1,566 wizyt
pytanie zadane 7 października 2018 w C i C++ przez Hinzeq Użytkownik (860 p.)
0 głosów
2 odpowiedzi 986 wizyt
pytanie zadane 20 czerwca 2018 w C i C++ przez Agnes Użytkownik (990 p.)
0 głosów
2 odpowiedzi 948 wizyt

92,632 zapytań

141,502 odpowiedzi

319,882 komentarzy

62,015 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...