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

try catch zapętla się na sprawdzaniu czy int jest literą

Object Storage Arubacloud
0 głosów
386 wizyt
pytanie zadane 22 kwietnia 2017 w C i C++ przez 87kelthuzad Obywatel (1,270 p.)

Witam mam dziwny problem bo w try catch chce sprawdzić czy mój int jest z przedziału od 1 do 6 ale użytkownik może się pomylić i wpisać np A. I tu mam problem bo wszystko działa oprócz sprawdzenia czy przypadkiem ktoś nie napisał litery. Chodzi o to że mam zapętlenie i wyskakuje mi informacja cały czas i do tego wyskakuje mi wyjątek tooSmall zamiast isAlpha

void Manage::setWhatMenuOption() noexcept {
    while (true) {
        try {
            std::cin >> whatMenuOption;
            if (whatMenuOption < 1) {
                throw badWhatMenuOptionTooSmall();
            }
            if (whatMenuOption > 6) {
                throw  badWhatMenuOptionTooBig();
            }
            if (isalpha(whatMenuOption)) {
                throw badWhatMenuOptionIsAlpha();
            }
            if (whatMenuOption >= 1 && whatMenuOption <= 6) {
                break;
            }
        }
        catch (badWhatMenuOptionTooSmall &ref) {
            ref.message();
        }
        catch (badWhatMenuOptionTooBig &ref) {
            ref.message();
        }
        catch (badWhatMenuOptionIsAlpha &ref) {
            ref.message();
        }
    }
}

 

komentarz 22 kwietnia 2017 przez tangarr Mędrzec (154,860 p.)
Jakiego typu jest zmienna whatMenuOption?
komentarz 22 kwietnia 2017 przez 87kelthuzad Obywatel (1,270 p.)
int

2 odpowiedzi

+2 głosów
odpowiedź 22 kwietnia 2017 przez tangarr Mędrzec (154,860 p.)
Strumień std::cin "spodziewa się" liczby. Jeżeli wpiszesz jakąś literę to do twojej zmiennej trafi zero i strumień ustawi flagę badbit.
Po wczytaniu danych do zmiennej powinieneś sprawdzić czy operacja się powiodła (możesz użyć std::cin.good()  lub std::cin.fail())
0 głosów
odpowiedź 22 kwietnia 2017 przez Wiciorny Ekspert (270,770 p.)

a jakiego typu jest whatMenuOption? bo może problem jest w konwersji, np widzi to nie jako "CHAR" ale jako litere- zapisaną cyfrą z klawiatury.

W dokumentacji zwróć uwagę: 

Parameters
c
Character to be checked, casted to an int, or EOF.

więc tutaj powinieneś jako argument podać stringa- który będzie zrzutowany na inta, a nie podawać int. 

komentarz 22 kwietnia 2017 przez 87kelthuzad Obywatel (1,270 p.)
czyli wystarczy jak tego inta przekonwertuję na string lub char i będzie ok
komentarz 23 kwietnia 2017 przez Wiciorny Ekspert (270,770 p.)
tak podejrzewam, daj znać jak sprawdzisz.... albo znajdziesz rozwiązanie, dziś wieczorkiem mogę się pobawić- jak nadal jest problem.
komentarz 23 kwietnia 2017 przez 87kelthuzad Obywatel (1,270 p.)
edycja 23 kwietnia 2017 przez 87kelthuzad

ok mam coś takiego działa ale nie wiem czy tak robi się sprawdzanie błędów

void Manage::setWhatMenuOption() noexcept {
    while (true) {
        try {
            getline(std::cin , whatMenuOptionString);
            if (whatMenuOptionString.empty()) {
                throw badWhatMenuOptionIsEmpty();
            }
            if (isalpha(whatMenuOptionString[0])) {
                throw badWhatMenuOptionIsAlpha();
            }
            if (isspace(whatMenuOptionString[0])) {
                throw badWhatMenuOptionIsWhiteSpace();
            }
            if (ispunct(whatMenuOptionString[0])) {
                throw  badWhatMenuOptionIsPunctuationMarks();
            }
            if (whatMenuOptionString[0] < '1') {
                throw badWhatMenuOptionTooSmall();
            }
            if (whatMenuOptionString[0] > '6') {
                throw badWhatMenuOptionTooBig();
            }
            if (whatMenuOptionString[0] >= '1' && whatMenuOptionString[0] <= '6') {
                whatMenuOption = std::stoi(whatMenuOptionString.c_str());
                std::cout << whatMenuOption << std::endl;
            }
            if (whatMenuOptionString[1]) {
                throw badWhatMenuOption();
            }
            break;
        }
        catch (badWhatMenuOptionIsEmpty &ref) {
            ref.message();
        }
        catch (badWhatMenuOptionTooSmall &ref) {
            ref.message();
        }
        catch (badWhatMenuOptionTooBig &ref) {
            ref.message();
        }
        catch (badWhatMenuOptionIsAlpha &ref) {
            ref.message();
        }
        catch (badWhatMenuOptionIsWhiteSpace &ref) {
            ref.message();
        }
        catch (badWhatMenuOptionIsPunctuationMarks &ref) {
            ref.message();
        }
        catch (badWhatMenuOption &ref) {
            ref.message();
        }
    }
}

 

komentarz 23 kwietnia 2017 przez 87kelthuzad Obywatel (1,270 p.)

można przed pętlą while dodać 

std::cin.ignore(1000, '\n');

to nie będzie od razu wyrzucany błąd ze string jest pusty.

Podobne pytania

+1 głos
1 odpowiedź 322 wizyt
pytanie zadane 5 maja 2021 w C i C++ przez Mavimix Dyskutant (8,390 p.)
0 głosów
2 odpowiedzi 689 wizyt
pytanie zadane 3 lipca 2018 w Java przez periedynek Obywatel (1,320 p.)
0 głosów
1 odpowiedź 436 wizyt
pytanie zadane 8 października 2017 w PHP przez ŁukaszD. Użytkownik (540 p.)

92,626 zapytań

141,486 odpowiedzi

319,844 komentarzy

62,009 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!

...