• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C++] Jak "zabezpieczyć" program przed wpisaniem litery zamiast cyfry?

Object Storage Arubacloud
0 głosów
8,170 wizyt
pytanie zadane 16 października 2015 w C i C++ przez po ile ptysie Początkujący (470 p.)

Hej. Od dłuższej chwili głowię się nad pewnym problemem. Robię właśnie program-ankiete, w której pytamy o różne rzeczy np. imie, nazwisko, wiek itp. I gdy przychodzi do wpisania jakiejś wartości do zmiennej wiek, oczywiście mogę zrobić po prostu cin >> wiek, ale chce ten program jakoś urozmaicić i "zabezpieczyć", więc wpadłem na pomysł, aby program sprawdzał czy wprowadzona wartość do zmiennej (int) wiek jest po poprawna, czyli czy jest liczbą, a nie literą. I moje pytanie jak to osiągnąć. 

W pewnym odcinku pana Zelenta(odcinek 6 kursu C++, operacja switch) znalazłem coś takiego:

 if (!(cin >> nr_miesiaca))
    {
        cerr<<"To nie jest liczba!";
        exit(0);
    }

(w razie gdy ktoś w switchu zamiast cyfry wpisze litere, to program wyświetla komunikat i sie zamyka)

Gdy ja tak zrobiłem i zamiast exit(0) dopisałem kolejne linie kodu program się zapętla i komunikat "To nie jest liczba" wyświetla się nonstop. Moje pytanie jest następujące, jak poprawnie napisać taką funkcję, która sprawdza czy wprowadzona wartość jest cyfrą, a w razie, gdy jest literą, to prosi o ponowne wpisanie wieku?

 

3 odpowiedzi

+1 głos
odpowiedź 16 października 2015 przez Patrycjerz Mędrzec (192,320 p.)

http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Obsluga-strumienia-wejsciowego/12 - nie ma tam pokazanego gotowego sposobu, ale wg informacji tam zawartych będziesz w stanie stworzyć taki mechanizm.

0 głosów
odpowiedź 16 października 2015 przez furas Maniak (53,800 p.)
bool poprawna = false;

while( poprawna == false ) {
   cout << "Podaj liczbe" << endl;

   if(!(cin >> nr_miesiaca))
   {
       cerr<<"To nie jest liczba!";
   } else {
      poprawna = true;
   }
}

Coś w powyższy sposób. Pisałem z głowy. Można z tego zrobić funkcję która przyjmuje tekst "Podaj ..." a zwraca odczytaną liczbę.

komentarz 16 października 2015 przez Avernis Nałogowiec (27,400 p.)
for(;;)
{
   //program
}

 

komentarz 16 października 2015 przez furas Maniak (53,800 p.)

No rzeczywiście można użyc nieskończoną pętlę i `break` yes

 

for( ;; ) {
   cout << "Podaj liczbe" << endl;
 
   if(!(cin >> nr_miesiaca))
   {
       cerr<<"To nie jest liczba!";
   } else {
      break;
   }
}

albo może nawet czytelniej
 

for( ;; ) {
   cout << "Podaj liczbe" << endl;
 
   if(cin >> nr_miesiaca)
      break;

   cerr<<"To nie jest liczba!";
}

 

komentarz 16 października 2015 przez niezalogowany

A nie łatwiej poprostu tak:

while(!(cin>>zmienna))
{
cout<<"to nie liczba\n";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),'\n');
}

Ale trzeba dodać

#include <limits>

 

komentarz 16 października 2015 przez niezalogowany
Pokaż kod...
komentarz 16 października 2015 przez po ile ptysie Początkujący (470 p.)
Działa! Dzięki wielkie @badbullpl
0 głosów
odpowiedź 25 stycznia 2016 przez Kerp Nowicjusz (210 p.)

Witam chciałbym się dowiedzieć co zrobić gdy wprowadzam na przykład 123dasdsa(najpierw!!! liczbe razem z napisem). Bo przeskakuje mi w inna cześć programu.

Ta metoda nie działa

while(!(cin>>zmienna))
{
cout<<"to nie liczba\n";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),'\n');
}

 

komentarz 25 stycznia 2016 przez Kerp Nowicjusz (210 p.)
Jak innym sposobem wykluczyć litery i znaki.

Myslalem o tablicy z literami i znakami a później

if zmienna różna od tej tablicy ze znakami

to napisz to nie jest liczba

else cin>>zmienna.

ALe nie wiem jak to zapisac w tablicy

Podobne pytania

0 głosów
4 odpowiedzi 595 wizyt
–2 głosów
2 odpowiedzi 224 wizyt
0 głosów
2 odpowiedzi 509 wizyt

92,620 zapytań

141,474 odpowiedzi

319,813 komentarzy

62,004 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...