std::cin - zapętlenie programu

0

#include <iostream>
#include <math.h>

double Funkcja(int x)
{
    if (x < 0) throw "Liczba nie moze byc ujemna\n";
    return sqrt(x);
}

int main()
{
    int x{ 0 };
	do
	{	
		std::cin >> x;
		try
		{
			std::cout << Funkcja(x) << std::endl;
		}
		catch (const char * s)
		{
			std::cout << s;
		}
	} while (x != 44);
    
}

Dlaczego gdy cin wczyta nie liczbę a literę to program się zapętla?

0

Czy gdy wstawię gdzieś w pętlę

		if (std::cin.fail())
		{
			std::cin.clear();
			std::cin.ignore();
		}

to będzie eleancko?

1

bo po nieudanym wczytaniu liczby, std::cin ma ustawioną flagę błędu i w związku z tym, kolejne operacje na tym obiekcie nic nie robią.
Musisz obsłużyć błąd i wyczyścić flagę błędu (clear).

0

Zauważyłem, że najczęściej tak robią, żeby pozbyć się wszystkich znaków pozostających w strumieniu.

		if (std::cin.fail())
		{
			std::cin.clear();
			while (std::cin.get() != '\n');
		}

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