[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 |