Program wpada w nieskończoną pętle

0

Witam :)
Siedzę nad prościutkim zadaniem i jestem w kropce.
Wyjaśnij dlaczego poniższy kod wpada w nieskończoną pętlę, gdy wprowadzony
zostanie niepoprawny znak, np. „x”.

#include <iostream>
int main()
{
std::cout << "Podaj kilka liczb, rozdzielając je spacjami
"
"(wpisz -1 aby zakończyć): ";
int i = 0;
while (i != -1) {
std::cin >> i;
std::cout << "Wpisano " << i << '\n';
}
} 

Rozumiem, że pętla idzie w nieskończoność, bo otrzymała znak, który jest charem, a nie intem, na który czeka. Wypadałoby więć w warunku pętli zastrzec, że program ma z niej wyjść, nie tylko po otrzymaniu -1, a także czegoś, co jest innym typem jak int. Ma ktoś pomysł w jaki sposób zapisać taki warunek?

1

http://stackoverflow.com/questions/18400620/cin-for-an-int-inputing-a-char-causes-loop-that-is-supposed-to-check-input-to-go

Czyli jak wskoczy jakiś błąd, to cin nie odczyta już nic więcej z wejścia, musisz wtedy wyczyścić błąd (cin.clear()) i możesz też wyczyścić pozostałe znaki czekające w strumieniu.
Ogólnie działanie na danych, które otrzymujesz z cin, nie sprawdzając czy są poprawne, jest kiepskim pomysłem, patrz odpowiedź w linku który podałem.

0

Dziękuję, chciałam użyć czyszczenia wszystkiego, co czeka w strumieniu, ale kompilator czepia się o numeric_limits i streamsize, mimo, że jest w przestrzeni nazw std :/

0

Już ok, brakowało headera limits, dziękuję :)

2
KarolinaGrudz napisał(a):

Już ok, brakowało headera limits, dziękuję :)

Proponuję nielimitowaną pomoc w programowaniu. Możemy nawet razem zamieszkać i wziąć ślub.

Wyślij mi wiadomość

0
#include <iostream>
using namespace std;

int main() {
	int i;
	while(cin >> i && i != -1)
		cout << i << " ";
}
0
#include <iostream>
#include <limits>

using namespace std;
 
int main() {
std::cout << "Podaj kilka liczb, rozdzielając je spacjami (wpisz -1 aby zakończyć): ";
int i = 0 ;

 while (true)
 {
    if (std::cin >> i)
    {
   	 if ( i == -1) break;
   	 cout << i << endl;
    }
    else
    {
         cout << "error, try again\n";
         cin.clear();
         cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
         break;
    }
    
  } 
 return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1