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

c++ cin a cin.ignore()

+1 głos
1,793 wizyt
pytanie zadane 7 października 2018 w C i C++ przez Hinzeq Użytkownik (860 p.)

Cześć,

Chcę wczytać wartość z klawiatury. Gdy używam cin.sync() wszystko działa poprawnie, ale wiem że tylko na windowsie sync() działa, natomiast gdy próbuję użyć cin.ignore() to muszę przy pierwszym podaniu wartości z klawiatury użyć entera. 

Przykładowo gdy podaję "3" i naciskam enter to nic się nie dzieje, dopiero po ponownym podaniu wartości i wciśnięciu entera program reaguje.

A  jak zamiast cin>>x, użyję getline(cin,x); to wyskakuje błąd: error: no matching function for call to 'getline(std::istream&, int&)'.

Kod:

cout<<"Zapisac?\n[1]Tak\n[2]Nie\n";
int zapis;
zapis=f_poprawne(0);
int f_poprawne(int x){
    bool stan_x;
    do{
        cin.clear();
        //cin.sync();
        cin.ignore(); // <-- TUTAJ
        cin>>x; // getline(cin,x);
        stan_x=cin.good();
        if(stan_x==0)
                cout<<"Wprowadzono zle dane! Podaj ponownie:\n";
        else if(x<1||x>2)
                cout<<"Wybrano z poza zakresu! Podaj ponownie:\n";
    }while(stan_x==0||x<1||x>2);
    return x;
}

Zawsze stosowałem cin.sync() ale dostałem informację bym zaczął używać ignore().
Przeszukałem internet, poczytałem o tej funkcji i zauważyłem, że czasami przyjmuje ona wartości w nawiasie: cin.ignore(1000,'\n');.
Nie będę ukrywać, że nie rozumiem o co w ignore() chodzi. Podobnie z getline, niby miał zapisywać łańcuch znaków, ale.. jest błąd. Czy on działa tylko na string, a na innych zmiennych nie?

Mógłby ktoś w łopatologiczny sposób wytłumaczyć jak tych funkcji używać i jak pominąć ten enter w programie?

Pozdrawiam,
Hinzeq.

2 odpowiedzi

0 głosów
odpowiedź 7 października 2018 przez PanRik Gaduła (4,510 p.)
edycja 7 października 2018 przez PanRik

Wewnątrz pętli do:
 

std::cin >> x
while( true == cin.fail() )
{
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    std::cin >> x;
}

To ci załatwia to , że nie musisz wciskać entera.

Edit: jakby nie działało to z góry to spróbuj według przykładu,

 Przykład:

    int x;
    while( !(cin >> x) )
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    };
    std::cout << x;

getline , według dokumentacji przyjmuje łopatologicznie: 

getline( skąd pobrać, gdzie wkleić );

Nie możesz wkleić do int. Jeśli chcesz robić takie manewry to zapoznaj się z stringstream >klik<

0 głosów
odpowiedź 7 października 2018 przez RafalS VIP (122,820 p.)

Tak getline przyjmuje string jako drugi parametr. W końcu nazywa się getLine :P.

Twój problem to cin.ignore(), które jak sama nazwa wskazuje ignoruje jeden znak, czyli własnie ten, który wpisujesz i wciskasz enter.

Nie potrzebujesz robić cin.sync().

A ten warunek jest dziwny:

(stan_x==0||x<1||x>2);

czemu nie != ?

Podobne pytania

0 głosów
2 odpowiedzi 1,433 wizyt
0 głosów
2 odpowiedzi 2,812 wizyt
pytanie zadane 30 czerwca 2019 w C i C++ przez patryk123 Nowicjusz (170 p.)
0 głosów
2 odpowiedzi 1,369 wizyt
pytanie zadane 20 czerwca 2018 w C i C++ przez Agnes Użytkownik (990 p.)

93,604 zapytań

142,529 odpowiedzi

322,997 komentarzy

63,092 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

Kursy INF.02 i INF.03
...