Zabezpieczenie przed wpisaniem litery

0

Witam, mam problem z małym programem, który ma pytać o liczbę i zwracać ją, ale jednocześnie być zabezpieczonym przed wpisaniem litery. Oczywiście można to zrobić z if, ale wtedy nie ma możliwości powrotu do pytania.

#include <iostream>
using namespace std;
int main()
{
    int liczba;
    do
    {
        cout<< "Podaj liczbe: "<<endl;
        cin>> liczba;
        cin.ignore();
    }while (!cin.good());

    cout<< "Podana liczba to: "<<liczba;
    return 0;

}

Program działa dobrze do momentu wpisania litery, wtedy pętla zaczyna wykonywać się bez końca, nie dając możliwości wpisania kolejnego znaku. Natomiast jeśli usunie się wykrzyknik sprzed cin.good(), pętla działa tak jak powinna dla cyfr, to znaczy po wpisaniu cyfry pyta o następny znak i daje możliwość wpisania go, ale wykonuje się w nieskończoność po wpisaniu litery.
Co robię nie tak?

0
#include <iostream>
using namespace std;
int main()
  {
   while(true)
     {
      cout<<"Podaj liczbe: ";
      int liczba;
      if(cin>>liczba)
        {
         cout<<"Podana liczba to: "<<liczba<<endl<<endl;

         //break; // jeżeli na tym chcesz zakończyć
        }
      else
        {
         cin.clear();
         cout<<"Ma byc liczba"<<endl<<endl;
        }
      //cin.ignore(); // lepiej to co niżej
      while(cin.get()!='\n') {}
     }
   return 0;
  }
0

Dziękuję bardzo za pomoc, ale dalej nie rozumiem, czemu mój program psuł się w tak dziwny sposób. Czy ktoś mógłby mi wytłumaczyć dlaczego nie dawał on możliwości wpisania kolejnego znaku, jeśli chodziło o litery, a na cyfrach wszystko działało?

0

Czy w takim razie możliwe jest delikatne zmodyfikowanie tego, co napisałem (cin.clear w pętli wyrzuca wartość 0 dla liter i nie daje możliwości wpisania) czy program musi wyglądać tak, jak ten z odpowiedzi?

0

Dziękuję, ale wtedy program działa dopiero po jednym przejściu pętli, tzn. nie ma znaczenia, co wpisze się za pierwszym razem. Tego się już chyba nie da przeskoczyć. Dziękuję za pomoc.

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