Zabezpieczenie przed wprowadzeniem złych danych.
Ostatnio zmodyfikowano 2017-06-08 21:06
pieter111 Temat założony przez niniejszego użytkownika |
Zabezpieczenie przed wprowadzeniem złych danych. » 2017-06-08 10:46:06 Witam, muszę zabezpieczyć aplikację przed wprowadzeniem złych danych, a konkretnie wprowadzana nazwa musi się składać wyłącznie z liter. Przed wprowadzaniem cyfr poradziłem sobie w następujący sposób: bool fail; do { cout << "Podaj pole powierzchni: "; cin >> glowa->pole_pow; fail = cin.fail(); cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); } while( fail == true );
Jakieś pomysły? Z góry dzięki i pozdrawiam. Wielkie dzięki Chowan za szybką podpowiedź - działa. |
|
Chowan |
» 2017-06-08 11:49:32 #include <cctype> i isalpha |
|
nachszon |
metoda wielokrotnego użytku » 2017-06-08 13:59:46 Można wczytany string rozłożyć na tablicę typu char i sprawdzić każdy znak. Poniżej metoda wraz z jej przykładowym zastosowaniem:
/* Name: Copyright: Nachszon Author: Nachszon Date: 08-06-17 13:34 Description: program prezentuje metodę weryfikacji danych jeżeli w podanym przez użytkownika stringu pojawi się znak inny niż litera, zakończ program z komunikatem błędu Algorytm sprawdzający: - Rozlóż zmienną klasy string na elementy tablicy typu char - Sprawdź w pętli każdy znak, czy nie jest literą - Jeżeli nie jest literą, wyrzuć komunikat błędu i przerwij działanie aplikacji - Jezli wszystkie znaki są literami, kontynuuj przetwarzanie danych */
#include <cstdlib> #include <iostream>
//konieczne, aby umożliwić skorzystanie z klasy string using namespace std;
/*metoda weryfikująca wprowadzone dane dane pobierane są przez metodę jako argument (string_dev) */ void check_string(string string_dev){ int size_string; int tab_index; //pomiar długości wprowadzonego łańcucha size_string=string_dev.length(); //index tablicy znaków, z których składa się zmienna typu string tab_index=0; //Rozłóż wprowadzony string na tablice znaków char //sprawdź każy znak, czy nie jest literą //przy pierwszym napotkanym znaku, który nie jest literą //wyrzuć komunikat błędu i przerwij przetwarzanie danych while (tab_index!=size_string){ //moduł sprawdzania typu znaku z wbudowaną reakcją if ( !isalpha(string_dev[tab_index])){ cout << "Nieprawidlowy typ danych" <<endl; cout << "Wymagane tylko litery" <<endl; exit(0); } tab_index++; } }
int main(int argc, char *argv[]) { string my_string; //Wczytanie danych cout << "Podaj nazwe: " << endl; cin>> my_string; //metoda weryfikacji typu danych check_string(my_string); //działanie, jeżeli metoda check_string(string_dev) przepuściła dane cout << "Dane ok..." << endl; cout << "Przetwarzam dane..." << endl; }
//KONIEC:)
|
|
karambaHZP |
» 2017-06-08 15:22:06 #include <iostream> #include <string> #include <algorithm> using namespace std;
int main() { string text; string nums { "0123456789" }; while( getline( cin, text ) && text.end() != find_first_of( text.begin(), text.end(), nums.begin(), nums.end() ) ) { cout << "znalazlem cyfrki, jeszcze raz:\n "; } cout << "czysty text: " << text << endl; } Program prosi o podawanie tekstów póki nie będzie bez cyferek. |
|
nachszon |
» 2017-06-08 15:38:49 Bardzo ładne i ścisłe rozwiązanie, ale zamiast
string nums { "0123456789" };
powinno chyba być:
string nums ( "0123456789" );
Nawiasy okrągłe zamiast klamrowe.
|
|
Monika90 |
» 2017-06-08 15:55:20 Klamry są jak najbardziej poprawne, a nawet zalecane przez niektóre standardy kodowania.
Za to w twoim kodzie brakuje #include <string> oraz #include <cctype>, a użycie isalpha nie jest bezpieczne, ponieważ argument funkcji isalpha musi mieć wartość którą można pomieścić w typie unsigned char (lub być równy EOF), nie spełni tego warunku gdy użytkownik wpisze polskie znaki. |
|
karambaHZP |
» 2017-06-08 16:13:00 Żeby klamerki działały trzeba uruchomić kompilację w standardzie C++11 -std=c++11 lub wyższym. |
|
pieter111 Temat założony przez niniejszego użytkownika |
» 2017-06-08 21:06:15 Dzięki wszystkim za podpowiedzi, już działa. |
|
« 1 » |