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

C++ Zabezpieczenie danych int

0 głosów
1,362 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 (158,580 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 (195,240 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ź 1,223 wizyt
pytanie zadane 27 grudnia 2016 w C i C++ przez breeg Początkujący (390 p.)
0 głosów
0 odpowiedzi 347 wizyt
pytanie zadane 10 listopada 2023 w C i C++ przez filip142 Nowicjusz (120 p.)
0 głosów
3 odpowiedzi 2,071 wizyt

93,424 zapytań

142,421 odpowiedzi

322,643 komentarzy

62,782 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...