Zabezpieczenie przed wpisywaniem liter

Bardzo często na forum pojawia się pytanie: jak zabezpieczyć program przed wpisaniem liter, gdy program oczekuje na liczby.
Najprostsze rozwiązanie w języku C++ wygląda tak:

int zmienna;
while(!(cin>>zmienna)) //dopóki strumień jest w stanie błędu -> dopóki podawane są błędne dane
{
  //ew komunikat błędu
  cin.sync(); //kasowanie zbędnych znaków z bufora
  cin.clear(); //kasowanie flagi błędu strumienia
}
//tutaj na pewno wczytano poprawne dane do zmienna
 


W języku C nie istnieje równie proste rozwiązanie tego problemu. Można spróbować użyć:

int zmienna;
while(scanf("%d", &zmienna) != 1) //dopóki nie uda się wczytać
{
  //ew. komunikat błędu
  fflush(stdin);
}


Ale nie jest to dobre rozwiązanie, ponieważ jest zależne od implementacji. fflush() nie zawsze powoduje wyczyszczenie bufora!
Rozwiązanie działające w każdej sytuacji (i implementacji) polega na żmudnym wyciągnięciu z stdin zalegających tam, zbędnych znaków (dodatkowa pętla w miejscu fflush())
Informacje
Ostatnia modyfikacja 12-02-2010 17:51 Ostatni autor Shalom
Ilość wyświetleń 557 Wersja 2
Komentarz

Katalog
Copyright © 2000-2006 by Coyote Group 0.9.3-pre3
Czas generowania strony: 0.0248 sek. (zapytań SQL: 10)