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

C++ Zabezpieczenie danych int

VPS Starter Arubacloud
0 głosów
1,032 wizyt
pytanie zadane 5 września 2018 w C i C++ przez Archeon Początkujący (480 p.)

Witam, 

Polecenie do zadania : 

Napisz prosty program, który wczyta imię, nazwisko i wiek dwóch osób. Funkcja główna programu ma mieć następującą postać:

int main()
{
    string imie[ 2 ];
    string nazwisko[ 2 ];
    
    
    int wiek[ 2 ];
    for( int i = 0; i < 2; i++ )
         wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
    
    for( int i = 0; i < 2; i++ )
         wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
    
    return 0;
}
  • Zadbaj o bezpieczeństwo wprowadzonych danych, tj. w przypadku błędnego wieku (np. wprowadzonego tekstu) program ma ponawiać żądanie aż do skutku.

 

Problem jest taki że "zabezpieczenie" "działa" ale nie tak jak należy. A mianowicie : 

Podaje imie >> Jan

Podaje nazwisko > > Kowalski

Podaje cyfre >> jeden

Pętla się uruchamia i pyta jeszcze raz o cyfre

Podaje cyfre >> 1

Na ekran wypisuje:

Imie: Jan

Nazwisko : Jan

Wiek : jeden

Dlaczego tak jest ?

 

Oto mój kod: 

#include <iostream>
#include <string>
using namespace std;

void wczytajOsobe (string & imie, string & nazwisko, int & wiek)
{
	cout << "Podaj imie: "; cin >> imie;
	cout << "Podaj nazwisko: "; cin >> nazwisko;
    int wiek_pomocnicza;
  
  do
    {
        cin.clear();
        cin.sync();
cout << "Podaj wiek ( cyfra ) !!! " << endl;
        cin >> wiek;
        wiek_pomocnicza = cin.good();

    } while (wiek_pomocnicza == false);
}

void wypiszOsobe(string & imie, string & nazwisko, int & wiek)
{

cout << "Imie: " << imie << endl;
cout << "Nazwisko: " << imie << endl;	
cout << "Wiek: " << wiek << endl;		
cout << endl;
}
int main()
{
    string imie[ 2 ];
    string nazwisko[ 2 ];
    
    
    int wiek[ 2 ];
    for( int i = 0; i < 2; i++ )
         wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
    
    for( int i = 0; i < 2; i++ )
         wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
    
    return 0;
}

 

komentarz 5 września 2018 przez Cixo Gaduła (4,070 p.)
Czy to musi być cin. czy może być inaczej za pomocą funkcji.
komentarz 5 września 2018 przez Archeon Początkujący (480 p.)
Tak, w poleceniu jest żeby zrobić to za pomocą cin.

W następnym kroku trzeba to przerobić wczytujac za pomocą getline.

2 odpowiedzi

0 głosów
odpowiedź 5 września 2018 przez mokrowski Mędrzec (155,460 p.)
int wczytajWiek(const string& msg, const string& error_msg)
{
    int age;
    for (;;)
    {
        cout << msg;
        cin >> age;
        if (cin)
        {
            break;
        }
        cout << error_msg;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
    return age;
}

 

0 głosów
odpowiedź 5 września 2018 przez Cixo Gaduła (4,070 p.)

Można własną funkcją sprawdzającą znak po znaku czy jest to liczba czy nie.

Jest tam kod ascii wykorzysóje że liczby w ascii są:

-większe niż 47

-mniejsze niż 58

wklejam kod musisz go zmodyfikować do swoich potrzeb.

#include <iostream>
#include <string>



bool test(std::string co){
	//wstepnie zakladamy ze to jest liczba
	bool czy = true;
	//sprawdzamy kazdy znak
	for(int x = 0; x  < co.length(); x++){
		
		if(co[x] > 47 && co[x] < 58){
			//to jest liczba - nic nie rub
		}else{
			czy = false;//to nie jest liczba juz jest wartosc false - 22h2 = false
		}
		
	}
	
	return czy;//wzracamy wartosc czy tak czy nie
}

int main() {
	
	std::cout<<"Podaj liczbe:";//podajemy liczba
	std::string text;
	std::cin>>text;
	bool czytak = test(text);//robimy test na liczbe
	//wypisujemy liczbe
	if(czytak){
		std::cout<<"Tak, to jest liczba \n";
	}else{
		std::cout<<"Nie, to nie jest liczba \n";
	}
	//zatrzymujemyt konsole
	system("pause");
	
	return 0;
}

 

komentarz 5 września 2018 przez Archeon Początkujący (480 p.)

Miałem błędy w cout'ach . Poprawiłem to i działa jak należy. Dzięki za odpowiedzi ;)

 

#include <iostream>
#include <string>
using namespace std;

void wczytajOsobe (string & imie, string & nazwisko, int & wiek)
{
	cout << "Podaj imie: "; cin >> imie;
	cout << "Podaj nazwisko: "; cin >> nazwisko;
    bool wiek_pomocnicza;
  
  do
    {
        cout << "Podaj wiek ( cyfra ) !!! " << endl;
		cin.clear();
        cin.sync();
        cin >> wiek;
        wiek_pomocnicza = cin.good();

    } while (wiek_pomocnicza == false);
}

void wypiszOsobe(string & imie, string & nazwisko, int & wiek)
{

cout << "Imie: " << imie << endl;
cout << "Nazwisko: " << nazwisko << endl;	
cout << "Wiek: " << wiek << endl;		
cout << endl;
}
int main()
{
    string imie[ 2 ];
    string nazwisko[ 2 ];
    
    
    int wiek[ 2 ];
    for( int i = 0; i < 2; i++ )
         wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
    
    for( int i = 0; i < 2; i++ )
         wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
    
    return 0;
}

 

komentarz 5 września 2018 przez Archeon Początkujący (480 p.)

Przerobiłem to na getline :

 
 

void wczytajOsobe (string & imie, string & nazwisko, int & wiek)
{
    cout << "Podaj imie: "; getline(cin,imie);
    cout << endl;
    cout << "Podaj nazwisko: "; getline(cin,nazwisko);
    bool wiek_pomocnicza;
  
  do
    {
        cout << "Podaj wiek ( cyfra ) !!! " << endl;
        cin.clear();
        cin.sync();
        cin >> wiek;
        wiek_pomocnicza = cin.good();

    } while (wiek_pomocnicza == false);
}


 

Wczytuje imie,nazwisko, wiek --- następnie pomija imię i od razu pyta o nazwisko i wiek. Dlaczego ?

komentarz 6 września 2018 przez j23 Mędrzec (194,920 p.)

Daj cin.ignore(numeric_limits<streamsize>::max(), '\n');  za linią 13.

komentarz 6 września 2018 przez Archeon Początkujący (480 p.)
edycja 6 września 2018 przez Archeon
Nie pomogło :/

 

@edit

Jednak działa.

Podobne pytania

+1 głos
1 odpowiedź 881 wizyt
pytanie zadane 27 grudnia 2016 w C i C++ przez breeg Początkujący (390 p.)
0 głosów
0 odpowiedzi 97 wizyt
pytanie zadane 10 listopada 2023 w C i C++ przez filip142 Nowicjusz (120 p.)
0 głosów
3 odpowiedzi 1,597 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...