Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zabezpieczenie przed wprowadzeniem złych danych.

Ostatnio zmodyfikowano 2017-06-08 21:06
Autor Wiadomość
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:
C/C++
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.
P-162242
Chowan
» 2017-06-08 11:49:32
#include <cctype> i isalpha
P-162243
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:)
P-162246
karambaHZP
» 2017-06-08 15:22:06
C/C++
#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.
P-162250
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.
P-162253
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.
P-162256
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.
P-162257
pieter111
Temat założony przez niniejszego użytkownika
» 2017-06-08 21:06:15
Dzięki wszystkim za podpowiedzi, już działa.
P-162269
« 1 »
  Strona 1 z 1