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

question-closed cin.get() w warunku pętli

0 głosów
1,015 wizyt
pytanie zadane 28 września 2019 w C i C++ przez enigmatycznyclay Bywalec (2,450 p.)
zamknięte 29 września 2019 przez enigmatycznyclay

Witam. Pytanie brzmi co robię nie tak i czego nie rozumiem. Mam taki oto kod który stworzyłem tylko po to żeby sobie potestować działanie niektórych elementów(szczególnie pobierania znaków/łańcuchów jako warunki pętli).

char chtab[10];

	for (int i = 0; i < 3; i++)
	{
		while (std::cin.get(chtab, 10))
		{
			std::cout << "while\n";
		}
		if (std::cin.fail())
			std::cout << "fail\n";
		if (std::cin.eof())
			std::cout << "eof\n";
		if (std::cin.bad())
			std::cout << "bad\n";
		std::cin.clear();
		std::cin.ignore(255, '\n');
	}

	std::cout << chtab;

spodziewałem się, że jak wpiszę jakiś tekst pokroju: "tak" to będę go wpisywał wiecznie bo wszystko jest w porządku, a jednak wyskakuje jedno "while" czyli pętla wykonuje się raz i potem kończy, następnie wyskakuje "fail" i program pyta ponownie o wpisanie słowa. Mógłby mi ktoś wyjaśnić co pominąłęm, a także jakieś dodatkowe informacje na temat umieszczania cin.get()(wersji do łańcuchów) w warunku pętli. Z góry dziękuje za odpowiedź

komentarz zamknięcia: rozwiązane

2 odpowiedzi

+1 głos
odpowiedź 29 września 2019 przez j23 Mędrzec (195,220 p.)
wybrane 29 września 2019 przez enigmatycznyclay
 
Najlepsza

Dzieje się tak, ponieważ w strumieniu pozostaje znak końca linii po poprzednim odczycie. Zatem następny odczyt jest pusty, co powoduje przejście w stan fail (get musi coś odczytać). Zrób tak:

while (std::cin.get(chtab, 10).ignore()) {
        ...
}

 

komentarz 29 września 2019 przez enigmatycznyclay Bywalec (2,450 p.)
Ahhhh faktycznie. Przecież jest jak wół napisane, że cin.get() zostawia ten znak w strumieniu, ale mimo to jakoś ciężko było mi dojść do takiego wniosku. Dziękuję bardzo.
0 głosów
odpowiedź 28 września 2019 przez tkz Nałogowiec (42,040 p.)

http://www.cplusplus.com/reference/istream/istream/get/ korzystasz z drugiego "konstruktora". Kończy zdanie znakiem null, co uniemożliwia dalszy zapis do jednej zmiennej, w tym przypadku tablicowej. 

komentarz 29 września 2019 przez enigmatycznyclay Bywalec (2,450 p.)
Rozumiem, że zapis kończy się dodaniem znaku pustego na koniec pobranego lancucha, ale nie rozumiem w jaki sposób umieszczenie tego pustego znaku uniemożliwia nadpisanie danych. Cały czas podaję przecież ten sam adres wskazujacy na poczatek tablicy.
komentarz 29 września 2019 przez tkz Nałogowiec (42,040 p.)

Nie jestem pewny, ale cin.get czytając tablice(od początku za każdym razem, bo tak podajesz) znajduje null, to kończy wczytywanie. 

        std::cin.clear();
        std::cin.ignore(255, '\n');

Daj to odrazu za pętle. 

Podobne pytania

0 głosów
1 odpowiedź 19,463 wizyt
pytanie zadane 9 marca 2016 w C i C++ przez Munvik Dyskutant (9,350 p.)
0 głosów
2 odpowiedzi 533 wizyt
+1 głos
2 odpowiedzi 957 wizyt
pytanie zadane 17 kwietnia 2021 w C i C++ przez Doge Gaduła (3,420 p.)

93,727 zapytań

142,668 odpowiedzi

323,283 komentarzy

63,287 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...