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

getline i cin.ignore

+3 głosów
31,433 wizyt
pytanie zadane 9 kwietnia 2015 w C i C++ przez KRX Początkujący (330 p.)

Mógłby mi ktoś wyjaśnić do czego służy cin.ignore. Oraz dlaczego jak użyje w moim kodzie np takie coś to nie działa. Tylko program się jakby kończy, omija te getline. I oczywiście jak to naprawić.

int a;
string b;
cin>>a;
getline(cin,b);

 

3 odpowiedzi

+5 głosów
odpowiedź 9 kwietnia 2015 przez szmq Pasjonat (22,770 p.)
wybrane 7 grudnia 2015 przez szmq
 
Najlepsza

Jeśli przed użyciem funkcji "getline" użyjemy obiektu "cin", ten ostatni pozostawia zwykle znak końca wiersza '\n' w buforze klawiatury. Funkcja "getline" napotykając ten znak natychmiast kończy działanie, więc żeby uniknąć błędnego działania programu, należy wywołać funkcję cin.ignore(). Zostało pokazane to w poniższym przykładzie:

 

#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
 
    cout << "Podaj liczbę: ";
    int liczba;
    cin >> liczba;
 
    cout << "Podaj tekst: ";
    string tekst;
    cin.ignore(); // to wywołanie usunie z bufora znak '\n' pozostawiony przez obiekt "cin"
    getline(cin, tekst);
 
    cout << liczba << ' ' << tekst << endl;
 
    return 0;
}

 

1
komentarz 23 grudnia 2017 przez Sebastian Fojcik Nałogowiec (43,040 p.)

To zadziała tylko jeśli w strumieniu jedynym pozostałym znakiem jest '\n'. Ale poniższy kod już nie zadziała dla wejścia "123    " <--- przed ENTERem są spacje.

cin >> liczba;    // wpisuję "123[SPACJA][SPACJA][ENTER]" 
cin.ignore();    // wyciągnie ze strumienia znak [SPACJA].
getline( cin, tekst ); // to zostanie przeskoczone

Program przeskoczy getline. Ciężko jest znaleźć na to rozwiązanie. Używanie cin oraz getline w jednym programie na przemian, to proszenie się o kłopoty :-P
Szczególnie jeśli chcemy się zabezpieczyć przez złośliwymi użyszkodnikami i tym co owe gryzonie wprowadzają do naszego programu poprzez standardowe wejście.

Istnieją takie przekonania, że chcąc bezpiecznie obsługiwać standardowe wejście najlepiej jest wszystko wczytywać getline i potem ewentualnie parsować na int jeśli chcemy liczbę. Jeśli parsowanie się nie powiedzie, to znaczy, że nie wprowadzono liczby. Nie trzeba zatem czyścić flag błędów, ignorować znaki 'n' i robić innych pierdół :-D

Funkcję parsujące napisy na liczby są dostępne w standardowej bibliotece C++.

0 głosów
odpowiedź 9 kwietnia 2015 przez Wirus Stary wyjadacz (14,000 p.)

Jeśli przed użyciem funkcji "getline" użyjemy obiektu "cin", ten ostatni pozostawia zwykle znak końca wiersza '\n' w buforze klawiatury. Funkcja "getline" napotykając ten znak natychmiast kończy działanie, więc żeby uniknąć błędnego działania programu, należy wywołać funkcję cin.ignore(). Zostało pokazane to w poniższym przykładzie:

 

 cin.ignore(); // to wywołanie usunie z bufora znak '\n' pozostawiony przez obiekt "cin"
    getline(cin, tekst);
komentarz 23 grudnia 2017 przez Sebastian Fojcik Nałogowiec (43,040 p.)

To zadziała tylko jeśli w strumieniu jedynym pozostałym znakiem jest '\n'. Ale poniższy kod już nie zadziała dla wejścia "abc    " <--- przed ENTERem są spacje.

cin >> str;    // wpisuję "abc[SPACJA][SPACJA][ENTER]" 
cin.ignore();    // wyciągnie ze strumienia znak [SPACJA].
getline( cin, str ); // wczyta resztę czyli [SPACJA][ENTER]

W rezultacie program przeskoczy niejako getline

0 głosów
odpowiedź 9 kwietnia 2015 przez kovi29 Obywatel (1,200 p.)
po cin>>a można też napisać linijke

while (cin.get() != '\n') continue;

...wyczyści bufor do napotkania znaku nowego wiersza....

Podobne pytania

0 głosów
2 odpowiedzi 1,308 wizyt
0 głosów
1 odpowiedź 445 wizyt
pytanie zadane 14 czerwca 2018 w C i C++ przez Agnes Użytkownik (990 p.)
0 głosów
1 odpowiedź 927 wizyt

93,425 zapytań

142,421 odpowiedzi

322,647 komentarzy

62,787 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
...