std::cin - zapętlenie programu

std::cin - zapętlenie programu
didzni
  • Rejestracja:prawie 9 lat
  • Ostatnio:2 dni
  • Postów:136
0
Kopiuj

#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?

didzni
  • Rejestracja:prawie 9 lat
  • Ostatnio:2 dni
  • Postów:136
0

Czy gdy wstawię gdzieś w pętlę

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

to będzie eleancko?

MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:minuta
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).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
didzni
  • Rejestracja:prawie 9 lat
  • Ostatnio:2 dni
  • Postów:136
0

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

Kopiuj
		if (std::cin.fail())
		{
			std::cin.clear();
			while (std::cin.get() != '\n');
		}
edytowany 1x, ostatnio: didzni

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.