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

Dziwne zachowanie przy wprowadzaniu danych

Ostatnio zmodyfikowano 2016-02-16 11:03
Autor Wiadomość
krzychu_ten
Temat założony przez niniejszego użytkownika
Dziwne zachowanie przy wprowadzaniu danych
» 2016-02-16 09:45:19
Napisz prosty program, który wczyta imię, nazwisko i wiek dwóch osób. Zmodyfikuj program z pierwszego zadania tak, aby używał do wczytywania tekstu funkcji std::getline.

C/C++
#include <iostream>
#include <string>

void wczytajOsobe( std::string & imie_nazwisko, int & wiek )
{
    std::cout << "Podaj imie i nazwisko: ";
    std::getline( std::cin, imie_nazwisko );
    std::cin.sync();
    std::cout << "Podaj wiek: ";
    std::cin >> wiek;
    bool x = std::cin.fail();
    if( x == true )
    do
    {
        std::cout << "To nie liczba, podaj nowa - ";
        std::cin.clear();
        std::cin.sync();
       
        std::cin >> wiek;
        x = std::cin.fail();
    } while( x == true );
   
}

void wypiszOsobe( std::string & imie_nazwisko, int & wiek )
{
    int i;
    std::cout << "Twoje imie i nazwisko: " << imie_nazwisko << std::endl;
    std::cout << "Twoj wiek: " << wiek << std::endl;
   
}

int main()
{
    std::string imie_nazwisko[ 2 ];
    int wiek[ 2 ];
    for( int i = 0; i < 2; i++ )
    {
        std::cout << std::endl << "Osoba " << i + 1 << std::endl << std::endl;
        wczytajOsobe( imie_nazwisko[ i ], wiek[ i ] );
    }
   
    std::cout << std::endl << "Wpisane osoby:" << std::endl;
    for( int i = 0; i < 2; i++ )
    {
        std::cout << std::endl << "Osoba " << i + 1 << std::endl << std::endl;
        wypiszOsobe( imie_nazwisko[ i ], wiek[ i ] );
    }
   
   
    return 0;
}

Program bez problemu prosi o wprowadzenie danych pierwszej osoby, ale przy drugiej nie daje możliwości wpisania imie_nazwisko.
Proszę o wsparcie.
P-144922
carlosmay
» 2016-02-16 11:03:47
std::cin >> wiek;
Operator >> po wprowadzeniu danych zostawia w buforze strumienia znak
'\n'
,
na który reaguje std::getline. Pobiera go ze strumienia i kończy działanie zostawiając pusty string.

Czyszczenie strumienia po wczytaniu wieku rozwiąże problem lub
C/C++
std::cin >> wiek;
std::cin.get(); // pobranie ze strumienia zalegajacego znaku '\n'
P-144923
« 1 »
  Strona 1 z 1