getline(), pętle, powójne wyświetlanie się pewnych informacji

0

Napisałem program - Jego zadaniem jest spytać użytkownika o imię, nazwisko i wiek dwóch osób.
Problemy w sumie są 2.

  1. Imie i nazwisko
  • Wyświetla się : Podaj imie
  • Wpisujemy dowolny zestaw znaków np. rtbk34
  • Nic się nie wyświetla; wpisujemy ponownie // <--- Błąd jest tutaj

*Analogicznie przy podawaniu nazwiska

  1. Wiek
  • Wyświetla się: Podaj wiek:
  • Podajemy dowolny zestaw liter ( przy podaniu liczby działa normalnie )
  • Wyświetla się: Podaj wiek: Podaj wiek: // <--- Błąd jest tutaj
  • Podajemy dowolny zestaw liter
  • Wyświetla się: Podaj wiek:
  • Podajemy dowolny zestaw liter
  • Wyświetla się: Podaj wiek:
  • (...)

Kod wygląda tak:

#include <iostream>
#include <string>
using namespace std;
int wczytajOsobe( string & imie, string & nazwisko, int & wiek )
{
        do
    {
        cout << "Podaj imie " << endl;
        getline( cin, imie );
        cin.clear();
        cin.ignore( 1000, '\n' );
    } while( cin.fail() == true );
        do
    {
        cout << "Podaj nazwisko " << endl;
        getline( cin, nazwisko );
        cin.clear();
        cin.ignore( 1000, '\n' );
    } while( cin.fail() == true );

    cout << "Podaj wiek " << endl;
        do
    {
        cin >> wiek;
        while ((wiek<1) || (wiek>1000)) {
    cout << "Podaj wiek: ";
    if (!(cin >> wiek)) {
    cin.clear();
    cin.ignore(1000, '\n');
    }
    }
        cin.clear();
        cin.ignore( 1000, '\n' );
    } while( cin.fail() == true );

    return imie, nazwisko, wiek;
}

void wypiszOsobe( string & imie, string & nazwisko, int & wiek )
{
    cout << "Imie: " << imie << endl;
    cout << "Nazwisko: " << nazwisko << endl;
    cout << "wiek: " << wiek << 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 ++ )
    {
        cout << endl;
        cout << "Osoba " << i + 1 << endl;
        wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
    }

    return 0;
}
1

Czyszczenie strumienia daj w instrukcji warunkowej if i wykonuj tylko gdy jest potrzebne.

if(!(std::cin)){
   std::cin.clear();
   std::cin.ignore();
}

dla liczb można

while(!(std::cin >> number)){
   // czyszczenie strumienia
}

... i jeszcze to...

return imie, nazwisko, wiek;

a deklarujesz, że funkcja zwróci wartość typu int.

1 użytkowników online, w tym zalogowanych: 0, gości: 1