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

Jak zrobić aby nie wczytywano liter.

Object Storage Arubacloud
0 głosów
1,323 wizyt
pytanie zadane 27 września 2016 w C i C++ przez Dmitrzak Dawid Użytkownik (680 p.)
Mam przykładowy kalkulator (albo co innego)

cin'em biore a i b

potem daje

cout<<a+b;.

Co zrobić by a i b wczytywał jedynie liczby ?

3 odpowiedzi

+4 głosów
odpowiedź 27 września 2016 przez mariush Dyskutant (7,860 p.)
wybrane 28 września 2016 przez Dmitrzak Dawid
 
Najlepsza

Pobierając cin'em dane jakiegokolwiek typu zostaną one zapisane do zmiennej tylko wtedy, gdy jej typ i typ danych są takie same lub istnieje między nimi możliwość niejawnej konwersji. Przykładowo wczytując liczbę 3.14 do zmiennej typu int zostanie ona pomyślnie wczytana bo zajdzie konwersja z jednego typu liczbowego na drugi. W innym przypadku, gdy dane wejściowe nie będą pasować do typu zmiennej do której mają być przypisane strumień cin zwróci błąd. O tym czy dane zostały poprawnie wczytane informuje funkcja cin.fail() lub samo wyrażenie cin >> zmienna.

Przykład:

int a;
cin >> a;
if(cin.fail())
{
    // Ten kod wykona się jeśli podane w strumieniu cin
    // dane nie będą formatem liczbowym
    cout << "Bledne dane wejsciowe" << endl;
}
else
{
    cout << "Podana liczba: " << a << endl;
}

Zawsze, gdy dane wejściowe zostaną poprawnie odczytane strumień cin jest czyszczony. Jeśli jednak dane są niepoprawne, nie są one usuwane a zostają dalej w strumieniu. Dlatego żeby dalej móc poprawnie używać strumienia cin nalezy go wyczyścić. W tym celu należy użyć dwóch funkcji:

cin.clear() - Jej użycie spowoduje zresetowanie stanu obiektu cin, tak żeby był zdatny do użytku. Jeśli po błędnym wczytaniu danych status strumienia nie zostanie zresetowany, dalej będzie on zwracał cin.fail() w dalszym działaniu programu tym samym uniemożliwiając odczytanie kolejnych zmiennych.

cin.ignore() - Ta funkcja służy temu, by zignorować błędne dane wejściowe znajdujące się w strumieniu. Ignorując te dane trzeba uwzględnić ich rozmiar oraz znak na którym ignorowanie ma się zatrzymać. Wywołując funkcję cin.ignore(3, 'a') ignorowane są 3 znaki na początku strumienia, chyba że zostanie napotkany znak 'a'. Wtedy ignorowanie kolejnych znaków jest przerywane. W przypadku błędnych danych wejściowych należy zignorować cały strumień, lub wszystko, aż do napotkania znaku nowej linii ('\n'). Aby tego dokonaćnależy wywołać funkcję cin.ignore(numeric_limits<streamsize>::max(), '\n') uprzednio załączając bibliotekę <numeric> do programu.

Przykład 2: z zastosowaniem cin.clear i cin.ignore

int a, b;
cin >> a;
if(cin.fail())
{
    // Ten kod wykona się jeśli podane w strumieniu cin
    // dane nie będą formatem liczbowym
    cout << "Bledne dane wejsciowe" << endl;
    // Resetowanie stanu obiektu cin, żeby był on później
    // zdatny do użytku
    cin.clear();
}
else
{
    cout << "Podana liczba: " << a << endl;
}

// Ignorowanie niepoprawnych danych wejściowych
cin.ignore(std::numeric_limits<streamsize>::max(), '\n');

if(cin>>b) cout << "Poprawne dane wejsciowe" << endl;
else cout << "Bledne dane wejsciowe" << endl;
0 głosów
odpowiedź 27 września 2016 przez unknown Nałogowiec (39,560 p.)
while(!(std::cin>>a>>b)){
  std::cin.clear();
  std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');//wymaga dodania biblioteki limits
  std::cerr<<"Błędne dane!";
}

 

–1 głos
odpowiedź 27 września 2016 przez krzysiek12345 Użytkownik (890 p.)
To zależy od tego jaki typ jest tych zmiennych jeżeli jest int to będzie chyba błąd lub nie zapisze prawidlowo tego.
komentarz 27 września 2016 przez krzysiek12345 Użytkownik (890 p.)
żle zapisze
komentarz 27 września 2016 przez krzysiek12345 Użytkownik (890 p.)
Musisz zrobić pętlę sprawdzającą czy podany wyraz jest typy string jeżeli tak to powtórz wczytywanie
1
komentarz 27 września 2016 przez unknown Nałogowiec (39,560 p.)

To zależy od tego jaki typ jest tych zmiennych

Typ nie ma tu znaczenia.

Musisz zrobić pętlę sprawdzającą czy podany wyraz jest typy string jeżeli tak to powtórz wczytywanie

Jeśli typ zmiennej to nie string to jak ma to sprawdzić?

komentarz 27 września 2016 przez Dmitrzak Dawid Użytkownik (680 p.)
Jak taka pętla powinna wyglądać ? :D Nie mam pojęcia jak sprawdzać stringi :D
komentarz 27 września 2016 przez unknown Nałogowiec (39,560 p.)
Spójrz na moją odpowiedź.

Podobne pytania

0 głosów
1 odpowiedź 233 wizyt
pytanie zadane 25 grudnia 2018 w C i C++ przez kris6700 Początkujący (260 p.)
0 głosów
2 odpowiedzi 213 wizyt
0 głosów
3 odpowiedzi 553 wizyt

92,617 zapytań

141,466 odpowiedzi

319,783 komentarzy

61,999 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!

...