[C++] Lekcja 17 zabezpieczenie przed źle wprowadzonymi danymi.
Ostatnio zmodyfikowano 2014-08-17 13:25
carlosmay Temat założony przez niniejszego użytkownika |
[C++] Lekcja 17 zabezpieczenie przed źle wprowadzonymi danymi. » 2014-08-13 21:41:22
#include <iostream> using namespace std;
int wczytajLiczbe() { int wczytLicz; if( 1 < wczytLicz < 1000 ); do { cin.good(); cin.fail(); cin >> wczytLicz; if( cin.fail() > 0 || wczytLicz < 1 || wczytLicz > 1000 ) cout << "Podales zle dane: sproboj ponownie." << endl; cin.clear(); cin.sync(); } while( cin.fail() == 1 || wczytLicz < 1 || wczytLicz > 1000 ); return wczytLicz; }
int main() { cout << "Podaj liczbe: "; int liczba = wczytajLiczbe(); cout << "Podales liczbe: " << liczba << endl; return 0; }
Problem jest gdy podaję do wczytania np. 123fg. Pozostałe przypadki ogarnąłem, czyli wpisywanie samych liter oraz liczby spoza założonego przedziału. |
|
Mateus. |
» 2014-08-13 21:57:34 if( 1 < wczytLicz < 1000 ); - To nic nie robi. do { cin.good(); cin.fail(); cin >> wczytLicz; if( cin.fail() > 0 || wczytLicz < 1 || wczytLicz > 1000 ) cout << "Podales zle dane: sproboj ponownie." << endl; cin.clear(); cin.sync(); } while( cin.fail() == 1 || wczytLicz < 1 || wczytLicz > 1000 ); Popraw też te warunki. One są bardzo przekombinowane i dlatego sam się w nich pogubiłeś. |
|
carlosmay Temat założony przez niniejszego użytkownika |
» 2014-08-16 21:28:02 int wczytajLiczbe() { int wczytLicz; do { cin.clear(); cin.sync(); cin >> wczytLicz; if( wczytLicz < 1 || wczytLicz > 1000 ) cout << "Podales zle dane: sproboj ponownie." << endl; } while( wczytLicz < 1 || wczytLicz > 1000 ); return wczytLicz; }
Poprawiłem funkcję. Faktycznie było tego za dużo. Trochę przekombinowałem. Nadal nie wiem jak zabezpieczyc sie przed wpisaniem takiej danej "123fg". Wyświetla, że podałem liczbę 123 i kończy pętlę. Jestem "świeży" w C++ i ten temat jest ostatnim jaki robiłem. Dzięki za wskazówki. |
|
kubek3898 |
» 2014-08-16 22:13:53 Powinieneś czyścić strumień po pobraniu zmiennej, nie przed. |
|
carlosmay Temat założony przez niniejszego użytkownika |
» 2014-08-17 01:17:00 W pierwszej zagmatwanej od kombinowania odslonie kodu mialem czyszczenie po przyjęciu zmiennej. Poczysciłem kod ze zbędnych warunków i instrukcji. Zostało tylko co ważne, ale nie rozwiązuje niewykrywania błędnej danej tj. 123fg . |
|
Mateus. |
» 2014-08-17 08:05:22 Zrób tak, aby warunek pętli był spełniony, tylko wtedy gdy udało się wczytać i liczba jest z określonego przedziału. |
|
carlosmay Temat założony przez niniejszego użytkownika |
» 2014-08-17 10:42:34 int main() { int liczba; bool poprawnie; do { cout << "Podaj liczbe: " << endl; cin >> liczba; poprawnie = cin.good(); cin.clear(); cin.sync(); if( liczba < 1 || liczba > 1000 ) cout << "Podales nieprawidlowa liczbe. Sprobuj ponownie. " << endl; } while( !poprawnie &&( liczba < 1 || liczba > 1000 ) ); cout << "Podales: " << liczba << endl << "Koniec" << endl << endl; system( "pause" ); return 0; }
Podaj liczbe: 123fg Podales: 123 Koniec
Press any key to continue . . .
Efekt jest ciągle ten sam. Googlowałem troche temat i chyba nie da rady tego naprawic w tym podstawowym zakresie. Jest tak samo jak wpisanie 3.33.333.3
program wczyta tylko 3.33 i pójdzie dalej. Dzięki za zainteresowanie. |
|
kubek3898 |
» 2014-08-17 11:11:37 http://cpp0x.pl/forum/temat/?id=2147&p=2Alueril stworzył dokładnie to, czego oczekujesz: #include <iostream> #include <windows.h>
using namespace std;
template < typename T, typename CharT, typename Traits > bool read( std::basic_istream < CharT, Traits >& istr, T & result ) { using namespace std; istr >> result; if( istr.good() ) { const ctype < CharT >& ctype_facet = use_facet < ctype < CharT > >( istr.getloc() ); if( ctype_facet.is( ctype < CharT >::space, Traits::to_char_type( istr.peek() ) ) ) { return true; } } else if( istr.eof() ) { return false; } istr.clear(); istr.sync(); return false; }
int main() { int liczba; while( cin.good() ) { cout << "Podaj liczbe: " << endl; if( read( cin, liczba ) && liczba > 1 && liczba < 1000 ) { cout << "Liczba prawidlowa: " << liczba << endl; break; } else { cout << "Podales nieprawidlowa liczbe. Sprobuj ponownie." << endl; } } cout << "Podales: " << liczba << endl << "Koniec" << endl << endl; system( "pause" ); return 0; }
|
|
« 1 » 2 |