cin>> [int] i obsługa błędnych danych

0

Witam,

mam mały problem, wprowadzenie błędnych danych blokuje mi strumień cin, przez co pętla robi się nieskończona, jeśli user wpisze zamiast cyfry znak:

void test(int& a,int& b)
{
	do
	{
		system("cls");
		cout<<"Podaj a [0,1 lub 2]";
		cin>>a;
		cin.ignore(255,'\n');
		cout<<"Podaj b [0,1 lub 2]";
		cin>>b;
		cin.ignore(255,'\n');
		cout<<a<<" "<<b;
	}while(a<0||b<0);

	return;
}

Poszukuję eleganckiego rozwiązania problemu, znalazłem takie, jak poniżej, ale trudno je nazwać eleganckim:

void test(int& a,int& b)
{
	char h;
	do
	{
		system("cls");
		cout<<"Podaj a [0,1 lub 2]";
		cin>>h;
		a=(int)h-48;
		cin.ignore(255,'\n');
		cout<<"Podaj b [0,1 lub 2]";
		cin>>h;
		b=(int)h-48;
		cin.ignore(255,'\n');
		cout<<a<<" "<<b;
		system("pause");
	}while(a<0||b<0);

	return;
}

Z góry dziękuję za sugestie.

Pozdrawiam

L@mer

0

Problem stary jak wczytywanie liczb... Jeśli nie chcesz błędów przy wczytywaniu, wczytaj jako text (char) i sam sprawdź i potem ewentualnie zamień na liczbę.

// normalne eleganckie rozwiązanie.

0

Miałem na myśli raczej odblokowanie strumienia wejścia po wprowadzeniu przez usera błędnych danych :-(. Z innych możliwości np. atoi() odpada, bo zwraca 0 jako błąd.

0
char val(char* s,long& res,char podst=0){
  if(!s)return 0;
  if(!s[0])return 0;
  ulong k=strlen(s);
  size_t i=0;
  signed char sg=1;
  if(k>1){
    if((!podst)||(podst==16)){
      if((k>2)&&(s[0]==48)&&(s[1]==120)){
        podst=16;
        i=2;
      }
      if(s[0]==36){
        podst=16;
        i++;
      }
    }
    if((!podst)||(podst==10)){
      if(s[0]==43)i++;
      if(s[0]==45){
        sg=-1;
        i++;
      }
    }
  }
  k=1;
  if(!podst)podst=10;
  do{
    signed short j=(unsigned char)(s[i]);
    j-=((j>96)?87:((j>64)?55:48));
    if(!(j>=0 && j<podst))return 0;
    (k*=podst)+=j;
  }while(s[++i]);
  if(podst==10)res=sg*k;
    else res=long(k);
  return 1;
}

Do przerobienia. To rozpoznaje podstawy przy zapisach:
+10,-10 (dec)- dla dec liczy res jako signed long
0x16 - hex klasyk z c, $10 - hex format pascala.
Dla podstawy innej niż 10 liczy res jako unsigned long.
Gdy brak możliwosci rozpoznania podstawy przyjmuje 10.

0

dzięki z odpowiedź.

ostatecznie wrzuciłem to do funkcji:

void getChar2Int(int& i)
{
	char h;
	cin>>h;
	i=(int)h-48;
	cin.ignore(255,'\n');
}

jest OKI?

// Jeśli działa, to jest oki. [mf]

0

w samym C to było prosto, jeśli scanf zwrócił mniej niż powinien to trzeba było dać fflush(stdin)
w c++ było bardziej skomplikowane, pamiętam, że kiedyś po dłuuugich bojach mi sie udało to zrobić. nietety kod się zpodział, a potem już się odtworzyć nie udało.
idea jest taka, że trzeba zrobić
cin>>x;
while(cin.fail) //nie pamietam co dokladnie
{
//tu jakos oproznic bufor cos ala flush,
cin>>x;
}

może trochę pomogło...

0

A wyjątki?

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