Zabezpieczenie przed wpisaniem złych znaków

0

tak jak w temacie . Zrobiłem ze program prosi o podanie cyfry .
Jeżeli wpisze np. asdfds123 , to program wroci i kaze podac jeszcze raz dane.
Jezeli wpisze np. 1asdasda , to juz program buguje sie i zapetla w nieskonczonosc.
Jezeli wpisze np. 123353453 , to jest dobrze!
Jezeli wpisze np. addafsfa , to jest dobrze wraca i kaze podac jeszcze raz.

{
int main()
{
int x;
cout <<"Podaj dlugosc liczb ";


while(!(cin>>x)) //dopóki strumień jest w stanie błędu -> dopóki podawane są błędne dane
{
  cout<<"Podaj poprawna liczbe     ";
  cin.clear(); //kasowanie flagi błędu strumienia
  cin.sync(); //kasowanie zbędnych znaków z bufora
}
//tutaj na pewno wczytano poprawne dane do zmienna
	cout<<" Liczba jaka podales  to ";
}

I teraz chodzi mi o to żeby nie zapentał się tylko prosił o podanie poprawnej danej.
PROSZE O POMOC!

0

Zrób wszystko normalnie w pętli. Do sprawdzania błędów użyj: http://www.cplusplus.com/reference/ios/ios/good/

0
istream &check(istream &s)
   {
    bool bad=false;
    int ch;
    while(((ch=s.get())!=EOF)&&(ch!='\n')) if((ch!=' ')&&(ch!='\t')) bad=true;
    if(bad) s.clear(ios::badbit); else if(ch==EOF) s.clear();
    return s;
   }

int main()
  {
   while(true)
     {
      cout <<"Podaj liczbe: ";
      int x;
      if(cin>>x>>check)
        {
         cout<<"Liczba jaka podales  to "<<x<<endl;
        }
      else
        {
         cin.clear(); //kasowanie flagi błędu strumienia
         cout<<"Podales niepoprawna liczbe"<<endl;
        }
      cin.sync(); //kasowanie zbędnych znaków z bufora
      cout<<endl;
     }
  }

Masz gwarancję że ani przed liczbą ani po niej nie będzie żadnych śmieci.

0
_13th_Dragon napisał(a):
istream &check(istream &s)
   {
    bool bad=false;
    int ch;
    while(((ch=s.get())!=EOF)&&(ch!='\n')) if((ch!=' ')&&(ch!='\t')) bad=true;
    if(bad) s.clear(ios::badbit); else if(ch==EOF) s.clear();
    return s;
   }

int main()
  {
   while(true)
     {
      cout <<"Podaj liczbe: ";
      int x;
      if(cin>>x>>check)
        {
         cout<<"Liczba jaka podales  to "<<x<<endl;
        }
      else
        {
         cin.clear(); //kasowanie flagi błędu strumienia
         cout<<"Podales niepoprawna liczbe"<<endl;
        }
      cin.sync(); //kasowanie zbędnych znaków z bufora
      cout<<endl;
     }
  }

Masz gwarancję że ani przed liczbą ani po niej nie będzie żadnych śmieci.

Dobrze napisane lecz ja bym zrobił to tak wtedy juz jest na 100% wszystko ok :

istream &check(istream &s)
   {
    bool bad=false;
    int ch;
    while(((ch=s.get())!=EOF)&&(ch!='\n')) if((ch!=' ')&&(ch!='\t')) bad=true;
    if(bad) s.clear(ios::badbit); else if(ch==EOF) s.clear();
    return s;
   }
 
int main()
  {
   while(true)
     {
      cout <<"Podaj liczbe: ";
      int x;
      if(cin>>x>>check)
        {
			if(x!=0){
			
         cout<<"Liczba jaka podales  to "<<x<<endl;
					}
					else{
					
					cin.clear(); //kasowanie flagi błędu strumienia
         cout<<"Podales niepoprawna liczbe"<<endl;
		}
        }
      else
        {
         cin.clear(); //kasowanie flagi błędu strumienia
         cout<<"Podales niepoprawna liczbe"<<endl;
        }
      cin.sync(); //kasowanie zbędnych znaków z bufora
      cout<<endl;
     }
  }

0

@Koleszka takise zrobił dobrze, ale nie rozumie co się dzieje w przypadku, gdy poda "1asdasda". A zostanie wczytana wartość "1", a reszta napisu "asdasda" pozostanie w buforze.
Jeśli potem wczytujesz jakieś dane to możesz mieć dziwne zachowania bo najpierw zostanie wczytana pozostała zawartość tego napisu.
Najlepiej przed każdym interaktywnym wczytywaniem dodać na wszelki wypadek "cin.sync();" lub na lenia dodać to zaraz po pętli.

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