Sprawdzanie poprawności wprowadzonych danych
Ostatnio zmodyfikowano 2016-08-09 21:55
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: #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? |
|
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' . |
|
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ń?)? |
|
The_Wert |
» 2016-08-09 16:38:41 |
|
carlosmay |
» 2016-08-09 18:23:51 Sprawdzenie znaku można sprowadzić do: { int a; cin >> a; if( cin.get() != '\n' ) { cout << "po liczbie wcisneto cos jeszcze\n"; } } |
|
jundymek Temat założony przez niniejszego użytkownika |
» 2016-08-09 20:17:00 Działa coś takiego: 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? |
|
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. |
|
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. int main() { int a; cin >> a; cin.clear(); char ch; while( cin.get( ch ) && ch != '\n' ) { cout << ch; } } Obsługa strumienia wejściowegoistream::get |
|
« 1 » |