• 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

Object Storage Arubacloud
0 głosów
636 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 (194,920 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,000 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,000 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ź 17,316 wizyt
pytanie zadane 9 marca 2016 w C i C++ przez Munvik Dyskutant (9,350 p.)
0 głosów
2 odpowiedzi 330 wizyt
+1 głos
2 odpowiedzi 478 wizyt
pytanie zadane 17 kwietnia 2021 w C i C++ przez Doge Gaduła (3,370 p.)

92,551 zapytań

141,396 odpowiedzi

319,527 komentarzy

61,936 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!

...