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

String, wczytywanie tekstu za pomocą funkcji getline

Ostatnio zmodyfikowano 2015-11-08 14:10
Autor Wiadomość
Zdziszek
Temat założony przez niniejszego użytkownika
String, wczytywanie tekstu za pomocą funkcji getline
» 2015-11-07 22:51:08
Witam, mam problem z następującym kodem.

C/C++
#include<stdio.h>
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;


int main()
{
    string imie, nazwisko;
    int wiek;
   
    for( int i = 0; i < 2; i++ )
    {
       
        cout << "Podaj imie: ";
        getline( cin, imie );
       
        cout << "Podaj nazwisko: ";
        getline( cin, nazwisko );
       
        cout << "Podaj wiek: ";
        cin >> wiek;
       
        cout << "Imie to: " << imie.c_str() << endl;
        cout << "Nazwisko to: " << nazwisko.c_str() << endl;
        cout << "Wiek to: " << wiek << endl;
    }
   
    system( "pause" );
    return 0;
}

Przy funkcji
getline
 program omija wczytywanie imienia w drugim powtórzeniu pętli.


Podaj imie: xxx
Podaj nazwisko: xxx
Podaj wiek: 20
Imie to: xxx
Nazwisko to:  xxx
Wiek to: 20
Podaj imie: Podaj nazwisko:

Tak wygląda log przy drugim powtórzeniu, gdzie tu jest błąd albo co pominąłem?
P-139784
michal11
» 2015-11-08 01:28:25
Mieszasz getline z operatorem>> dla cin. Generalnie te dwie funkcje działają trochę inaczej, po wczytaniu czegokolwiek operatorem w buforze zostaje jeszcze znak entera (getline go nie pozostawia) którym potwierdzasz zakończenie wpisywania dlatego wywołanie getline wczytuje ten pozostawiony znak entera. Rozwiązanie to albo używanie tylko getline albo flushowanie strumienia (czyszczenie bufora) przez getlinem.
P-139790
j23
» 2015-11-08 10:22:02
C/C++
...
cout << "Podaj wiek: ";
cin >> wiek;

cin.ignore( numeric_limits < streamsize >::max(), '\n' );
P-139795
Zdziszek
Temat założony przez niniejszego użytkownika
» 2015-11-08 12:51:35
Dzięki za pomoc, kod
cin.ignore( numeric_limits < streamsize >::max(), '\n' );
 rozwiązał problem, a powiedz mi Michał flushowanie bufora, czyli
cout << flush;
 tak?Bo próbowałem na kilka sposobów, ale nic to nie zmieniło, zauważyłem właśnie, że problem pojawił się przy zmieszaniu getline i cin, ale, gdy miałem typ string i int to nie wiedziałem jak zrobić to inaczej.
P-139807
michal11
» 2015-11-08 12:59:54
C/C++
std::cin.clear();
std::cin.sync();

Wystarczyło poszukać w kursie.
P-139809
Zdziszek
Temat założony przez niniejszego użytkownika
» 2015-11-08 13:08:35
To nie działa, tego już próbowałem zanim założyłem tutaj temat;p
P-139811
carlosmay
» 2015-11-08 13:28:21
Musisz mieć świadomość co zostaje w strumieniu po wczytywaniu.
Najprościej po użyciu std::cin użyć std::cin.get();
Pobiera zalegający znak nowego wiersza po wprowadzeniu liczby ( w tym przypadku ).
P-139812
Zdziszek
Temat założony przez niniejszego użytkownika
» 2015-11-08 13:34:30
Działa, dzięki=]
P-139813
« 1 » 2
  Strona 1 z 2 Następna strona