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

getline i cin.ignore

Object Storage Arubacloud
+3 głosów
29,623 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,020 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,020 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 919 wizyt
0 głosów
1 odpowiedź 406 wizyt
pytanie zadane 14 czerwca 2018 w C i C++ przez Agnes Użytkownik (990 p.)
0 głosów
1 odpowiedź 706 wizyt

92,563 zapytań

141,416 odpowiedzi

319,596 komentarzy

61,948 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...