• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Ochrona programu przed znakami.

Object Storage Arubacloud
0 głosów
465 wizyt
pytanie zadane 12 stycznia 2016 w C i C++ przez GameFreak Początkujący (450 p.)

Witam. Mam problem. Zrobiłem program do losowania liczb, ale nie wiem jak go zabezpieczyć tak aby użytkownik nie wpisywał znaków tylko same liczby. Prosiłbym o jakąś radę. Z góry dzięki.

#include <iostream>
#include <cstdio>
#include <windows.h>
#include <clocale>
#include <cstring>
#include <time.h>

using namespace std;

struct RRecordData
{
    int ID;
    int Number;
};

int RandRange( int min, int max )
{
    return min + rand() % (1 + max - min);
}

void GetBalls(int *numbers, int *mini, int *maxi)
{

    printf( "Podaj ilosc kulek do wylosowania: " );
    scanf( "%d", numbers);

    printf( "Podaj najmniejsza wartosc losowanej kulki: " );
    scanf( "%d", mini);

    printf( "Podaj najwieksza wartosc losowanej kulki: " );
    scanf( "%d", maxi);

}

void GetRandomNumbers(int *num, int *mini, int *maxi)
{
    RRecordData * Losowanie;
    Losowanie = new RRecordData[ *num + 1];

    srand( time( NULL ) );

    for( int i = 1; i <= *num; i++ )
    {
        Losowanie[ i ].ID = i;
        Losowanie[ i ].Number = RandRange( *mini, *maxi );
    }

    printf( "----------------\n" );
    printf( "|  ID  | Number |\n" );
    printf( "-----------------\n" );

    for( int j = 1; j<=*num; j++ )
        printf( "| %4d | %4d   |\n", Losowanie[ j ].ID, Losowanie[ j ].Number );

    delete[] Losowanie;

}

int main()
{
    int mini, maxi;
    int numbers;

    GetBalls(&mini, &maxi, &numbers);

    GetRandomNumbers(&mini, &maxi, &numbers);

    return 0;
}

 

1 odpowiedź

+2 głosów
odpowiedź 12 stycznia 2016 przez Ada Pieńkowska Początkujący (340 p.)
Ochrona przed wpisywaniem liter to drobnostka. Biblioteka <cctype> ma szereg funkcji sprawdzających czy dany znak jest cyfrą, czy literą (czy jeszcze znakiem pisanym, warto z nich korzystać tak myślę, bo z reguły powinny być bardziej przenośne niż to co sobie sami napiszemy) →http://www.cplusplus.com/reference/cctype/isalpha/
Polecam też pilnować czy liczby nie są wprowadzane w złej kolejności (najpierw maksymalna, później minimalna). Nie są wprowadzane liczby ujemne (np. ujemna liczba kul do wylosowania → wprowadzić unsigned).
komentarz 12 stycznia 2016 przez GameFreak Początkujący (450 p.)
Dziękuje za pomoc. Spróbuje skorzystać z tych funkcji.

Pozdrawiam
komentarz 12 stycznia 2016 przez GameFreak Początkujący (450 p.)

Prosiłbym o opinie. Zrobilem takie coś. 

  while(numbers < 0 || mini > maxi)
    {
        printf("Podano niepoprawne wartosci. Sprobuj jeszcze raz.\n\n");
        GetBalls(&numbers, &mini, &maxi);
    }

Warunek, który sprawdza czy ilość kulek nie jest ujemna i czy minimalna liczba nie jest większa od maksymalnej. Aby chronić program przed wprowadzaniem znaków przez użytkownika użyłem atoi. Nie mogłem wpaść na żaden inny pomysł. 

void GetBalls(int *numbers, int *mini, int *maxi)
{
    unsigned int bufferlength = 50;
    char tablica[bufferlength];
    bool NumberTrue = true;
    bool NumberTrue1 = true;
    bool NumberTrue2 = true;

    while(NumberTrue==true)
    {
        printf( "Podaj ilosc kulek do wylosowania: ");
        fgets(tablica, bufferlength, stdin);

        *numbers = atoi(tablica);

        if(*numbers==0)
            printf("Podano nieprawidlowa wartosc. Sproboj ponownie.\n\n");
        else
            NumberTrue=false;
    }

    while(NumberTrue1==true)
    {
        printf( "Podaj minimalna wartosc wylosowanej kulki: ");
        fgets(tablica, bufferlength, stdin);

        *mini= atoi(tablica);

        if(*mini==0)
            printf("Podano nieprawidlowa wartosc. Sproboj ponownie.\n\n");
        else
            NumberTrue1=false;
    }

    while(NumberTrue2==true)
    {
        printf( "Podaj maksymalna wartosc wylosowanej kulki: ");
        fgets(tablica, bufferlength, stdin);

        *maxi = atoi(tablica);

        if(*maxi==0)
            printf("Podano nieprawidlowa wartosc. Sproboj ponownie.\n\n");
        else
            NumberTrue2=false;
    }

}

 

komentarz 13 stycznia 2016 przez Ada Pieńkowska Początkujący (340 p.)
Wydaje się okej.

PS w głównym kodzie masz błąd:

linia 35: void GetRandomNumbers(int *num, int *mini, int *maxi)

A w funkcji main przekazujesz parametry na odwrót:

linia 66: GetRandomNumbers(&mini, &maxi, &numbers);

Podobne pytania

0 głosów
1 odpowiedź 677 wizyt
pytanie zadane 9 października 2019 w PHP przez Paproch Użytkownik (700 p.)
0 głosów
2 odpowiedzi 353 wizyt
pytanie zadane 22 sierpnia 2016 w C i C++ przez BlackMoon Obywatel (1,730 p.)
+3 głosów
2 odpowiedzi 754 wizyt
pytanie zadane 4 kwietnia 2015 w PHP przez HaKIM Szeryf (87,590 p.)

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...