• 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
56 wizyt
pytanie zadane 28 września w C i C++ przez enigmatycznyclay Bywalec (2,400 p.)
zamknięte 29 września 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 przez j23 VIP (108,580 p.)
wybrane 29 września 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 przez enigmatycznyclay Bywalec (2,400 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 przez tkz Dyskutant (8,160 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 przez enigmatycznyclay Bywalec (2,400 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 przez tkz Dyskutant (8,160 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ź 6,524 wizyt
pytanie zadane 9 marca 2016 w C i C++ przez Munvik Dyskutant (8,630 p.)
0 głosów
2 odpowiedzi 113 wizyt
0 głosów
1 odpowiedź 93 wizyt
pytanie zadane 20 lipca 2018 w C i C++ przez Hinzeq Użytkownik (850 p.)
Porady nie od parady
Wynikowy wygląd pytania, odpowiedzi czy komentarza, różni się od tego zaprezentowanego w edytorze postów. Stosuj więc funkcję Podgląd posta znajdującą się pod edytorem, aby upewnić się, czy na pewno ostateczny rezultat ci odpowiada.Podgląd posta

66,985 zapytań

113,890 odpowiedzi

241,338 komentarzy

46,942 pasjonatów

Przeglądających: 207
Pasjonatów: 9 Gości: 198

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...