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

Jak działa cin.ignore()?

0 głosów
2,696 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,730 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 (195,240 p.)

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

Ja tam błędu nie widzę.

Podobne pytania

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

93,425 zapytań

142,421 odpowiedzi

322,646 komentarzy

62,785 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...