Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Sprawdzanie poprawności wprowadzonych danych

Ostatnio zmodyfikowano 2016-08-09 21:55
Autor Wiadomość
jundymek
Temat założony przez niniejszego użytkownika
Sprawdzanie poprawności wprowadzonych danych
» 2016-08-09 15:13:26
Próbuję zrozumieć rozdział dotyczący obsługi strumienia wejściowego - sprawdzanie poprawności wprowadzonych danych. Poniżej podaję kod z zadania domowego poziom 2 - funkcje:
"Napisz funkcję, która będzie wczytywała liczby ze standardowego wejścia i zwracała wczytaną wartość. Funkcja ma zagwarantować, że zwracana liczba zawsze jest poprawna. Oznacza to, że funkcja będzie musiała pytać użytkownika o wprowadzenie liczby dopóki nie poda poprawnej. "

Mam coś takiego:
C/C++
#include <iostream>
int wczytajLiczbe()
{
    int a;
    std::cin >> a;
    while( std::cin.fail() )
    {
        std::cin.clear();
        std::cin.ignore( 1000, '\n' );
        std::cout << "Podaj poprawna liczbe: ";
        std::cin >> a;
    }
   
    return a;
}

int main()
{
    std::cout << "Podaj liczbe: ";
    int liczba = wczytajLiczbe();
    std::cout << "Podales liczbe: " << liczba << std::endl;
    return 0;
}

Jak wpiszę liczbę wszystko jest ok. Jak wpiszę litery (np. asasasa) przechodzi do "Podaj poprawną liczbe" tak jak powinien. Problem pojawia się jak wpiszę np. 34nnn . Program nie zauważa problemu i wczytuje po prostu liczbę 34. W jaki sposób prawidłowo sprawdzać poprawność wprowadzonych danych?
P-150683
karambaHZP
» 2016-08-09 15:27:16
Tak to działa. Jeśli chcesz możesz po wczytaniu sprawdzać czy w buforze strumienia znajdują się jakieś inne znaki poza
'\n'
.
P-150684
jundymek
Temat założony przez niniejszego użytkownika
» 2016-08-09 15:34:28
Czyli mam rozumieć, że napisałem to poprawnie? Możesz podpowiedzieć jak sprawdzać te znaki (w Pythonie jest coś takiego jak isdigit(), isalpha() - może coś w ten deseń?)?
P-150685
The_Wert
» 2016-08-09 16:38:41
W C++ tez jest isdigit() i isalpha(). Musisz tylko dodać plik nagłówkowy <cctype>:
http://cpp0x.pl/dokumentacja​/standard-C/cctype-ctype-h/592
P-150686
carlosmay
» 2016-08-09 18:23:51
Sprawdzenie znaku można sprowadzić do:
C/C++
{
    int a;
    cin >> a;
   
    if( cin.get() != '\n' ) {
        cout << "po liczbie wcisneto cos jeszcze\n";
    }
}
P-150688
jundymek
Temat założony przez niniejszego użytkownika
» 2016-08-09 20:17:00
Działa coś takiego:

C/C++
int a;
std::cin >> a;
while( std::cin.get() != '\n' ) {
    std::cin.clear();
    std::cin.ignore( 1000, '\n' );
    std::cout << "Podaj poprawna liczbe: " << std::endl;
    std::cin >> a;
}

Mógłbyś carlosmay wyjaśnic co dokładnie oznacza cin.get() != '\n'? Co ma nowa linia do sprawdzenia poprawności wprowadzonego tekstu?
P-150692
The_Wert
» 2016-08-09 21:47:16
Wydaje mi się, że chodzi o to, że kiedy po liczbie wprowadzisz "nieliczby", zapełnisz bufor. Jeśli tym innym znakiem nie będzie '\n', to program cie o tym poinformuje. Jeżeli się mylę, to mnie poprawcie.
P-150694
carlosmay
» 2016-08-09 21:55:51
Mógłbyś carlosmay wyjaśnic co dokładnie oznacza cin.get() != '\n'?
metoda get() bez argumentów pobiera jeden znak z bufora strumienia i go zwraca (lub EOF jeśli nic nie ma w buforze).
Czyli
cin.get() != '\n'
 pobiera jeden znak i porównuje go ze znakiem
'\n'
.

Co ma nowa linia do sprawdzenia poprawności wprowadzonego tekstu?
A no ma. Operator strumienia wejściowego
>>
 pobiera dane do zmiennej, ale pozostawia w buforze strumienia znak nowej linii.
Poprawne wczytanie danych do zmiennej (czyli wszystko z wejścia) pozostawia znak '\n', który sprawdzamy,
natomiast dopisanie znaku niezgodnego z typem zmiennej powoduje przerwanie wczytywania danych
i pozostałe niepoprawne dane pozostają w buforze i czekają na odczytanie.
C/C++
int main()
{
    int a;
    cin >> a;
    cin.clear();
   
    // w pętli wypisujemy wszystko czego nie udało się wczytać
    char ch;
    while( cin.get( ch ) && ch != '\n' ) {
        cout << ch;
    }
}
Obsługa strumienia wejściowego
istream::get
P-150695
« 1 »
  Strona 1 z 1