• 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.

VPS Starter Arubacloud
0 głosów
1,373 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ź 249 wizyt
pytanie zadane 25 grudnia 2018 w C i C++ przez kris6700 Początkujący (260 p.)
0 głosów
2 odpowiedzi 292 wizyt
0 głosów
3 odpowiedzi 651 wizyt

92,973 zapytań

141,938 odpowiedzi

321,180 komentarzy

62,301 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...