Zabezpieczanie przed wprowadzaniem liter
Ostatnio zmodyfikowano 2014-01-01 16:38
Pytajnik Temat założony przez niniejszego użytkownika |
» 2013-12-24 14:26:04 Wiem, jak się zabezpiecza, tyle że to nie działa tak jak chce. Chodzi mi oto, żeby program dawał wiadomość "Zły znak", (jak podam zły znak). Problem jest w tym, że jak podam do zmiennej 'a' liczbę, a do zmiennej 'b' najpierw liczbę potem literę to program nie bierze pod uwagę litery(bierze samą liczbę i oblicza wynik, a litera przechodzi do następnego wczytania) Operator >> odczytuje dane do pierwszego nieprawidłowego znaku i wyrzuca błąd, gdy niczego się nie udało odczytać. Gdy podasz 7k pobrane jest 7, a k zostaje w strumieniu i, przy następnym wczytywaniu, jest pobierane w pierwszej kolejności. Czyść strumień przed wczytywaniem. | Jak to zabezpieczyć, żeby ta litera była wzięta pod uwagę i wyświetlił się "Zły znak"? |
|
pekfos |
» 2013-12-24 14:55:08 Wczytuj jako tekst, sprawdzaj i konwertuj, lub sprawdzaj następny znak w strumieniu. |
|
DejaVu |
» 2013-12-24 15:01:23 Druga opcja to pobieranie danych za pomocą getch() przy pomocy biblioteki conio.h, ale to jest rozwiązanie stricte windowsowe. |
|
Kefirek |
» 2013-12-25 12:01:28 Witam Poniżej zamieściłem część twojego kodu z wstawioną przeze mnie obsługą błędu przed wprowadzeniem liter: case 2: { system( "cls" ); cout << "=====================" << endl; SetConsoleTextAttribute( pisadlo, 3 ); cout << " DODAWANIE " << endl; SetConsoleTextAttribute( pisadlo, 7 ); cout << "=====================" << endl; cin.clear(); cout << "Podaj pierwsza liczbe: "; while( !( cin >> a ) ) { cin.clear(); while( cin.get() != '\n' ) continue; cout << "Prosze podac liczbe: "; } cout << "Podaj druga liczbe: "; cin >> b; cout << "Liczba " << a << " dodac liczba " << b << " = " << a + b << endl; cout << "\nAby wrocic wcisnij klawisz 0"; break; }
Rozwiązuje to problem tylko jak wprowadzisz pierwszą literę np: a lub a5, ale nie rozwiązuje problemu jeśli wstawisz np 1qq lub 1122bas itp. Pozdrawiam Kefirek |
|
pekfos |
» 2013-12-25 14:12:27 Zapisuj wartości otrzymywane z cin.get() i w pętli sprawdzaj, czy nie ma tam liter. |
|
Kefirek |
» 2013-12-31 14:28:30 Witam Oto cześć kodu, który pozwala ominąć problem wprowadzania niewłaściwych danych. Konkretnie w tym przypadku program prosi o podanie liczby od 1 do 7. Po wprowadzeniu liter i innych znaków w różnych formach np:(ASd.;[}^7) lub liter z liczbami np (nndsads1212 lub 12313232fdfd) program prosi o podanie właściwej liczby od 1 do 7. oto kod: void Obsluga_menu( klient & x ) { Show_menu(); JAK TO DZIA Ł A int wybor = 0; cout << "Wprowadź jedną z opcji menu: "; stringstream ss; string choice; cin >> choice; if( choice.length() == 1 ) { ss << choice; ss >> wybor; } while( wybor != 7 ) { switch( wybor ) { case 1: system( "cls" ); Dodaj_klienta(); break; case 2: system( "cls" ); Show_wprow_dane(); break; case 3: system( "cls" ); Zapis_plik(); break; case 4: system( "cls" ); Odczyt_do_ekranu(); break; case 5: system( "cls" ); Obsluga_pod_menu( x ); break; case 6: system( "cls" ); cout << "Dziś jest: "; system( "date /t" ); cout << endl; break; default: system( "cls" ); cout << "Nie ma takiej opcji!. Wprowadź jedną z opcji menu:\n\n"; } Show_menu(); cout << "Wprowadź jedną z opcji menu: "; cin >> choice; if( choice.length() == 1 ) { stringstream ss; ss << choice; ss >> wybor; } } }
......cd inaczej mówiąc jeżeli wprowadzimy do zmiennej choice coś dłuższego niż 1 znak zmienna int wybor = 0 i program przechodzi do instrukcji na dole: Show_menu(); cout << "Wprowadź jedną z opcji menu: "; cin >> choice; if( choice.length() == 1 ) { stringstream ss; ss << choice; ss >> wybor; }
......prosi o podanie liczby od 1 do 7 i jeżeli wpowadzimy 9 program przejdzie do instrukcji switch default: itd Pozdrawiam Kefirek |
|
Kefirek |
» 2014-01-01 16:38:58 ......a ten fragment kodu załatwi problem z danymi typu 1 3 s r t, krótko mówiąc pojedyncze znaki oddzielone spacją lub tabulatorem: int StrToInt3( string str ) { int temp = 0; locale loc( "polish" ); stringstream ss; if( str.length() <= 2 ) { for( int i = 0; i < str.length(); i++ ) { if( isalpha( str.c_str()[ i ], loc ) ) return 0; ss << str[ i ]; ss >> temp; if( cin.peek() == ' ' || cin.peek() == '\t' ) { cin.sync(); return 0; } } } return temp; }
|
|
1 « 2 » |