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

getline(); zostaje przez program pominięty jeśli jest wywoływany w metodzie C++

Object Storage Arubacloud
0 głosów
834 wizyt
pytanie zadane 16 listopada 2016 w C i C++ przez Konrad Nabożny Stary wyjadacz (13,460 p.)
Chodzi konkretnie o metodę description_on_start();

Proszę mi powiedzieć dlaczego program przez to przechodzi całkowicie to ignorując. Dziękuję z góry za odpowiedzi.

 

http://wklej.to/tYWzG

2 odpowiedzi

0 głosów
odpowiedź 16 listopada 2016 przez Dubgron Mądrala (5,620 p.)
edycja 16 listopada 2016 przez Dubgron
 
Najlepsza

Problemem jest to, iż nie czyścisz strumienia wejścia, co przy korzystaniu z innych opcji niż std::cin czy fwrite, jest konieczne. Wystarczy, że przed std::getline() wstawisz std::cin.ignore() 

std::cout << std::endl << std::endl << "Komunikat: ";
std::cin.ignore();
std::getline(std::cin, komunikat);

 

komentarz 16 listopada 2016 przez Konrad Nabożny Stary wyjadacz (13,460 p.)
Działa dokładnie tak jak chciałem. Dziękuję!
komentarz 16 listopada 2016 przez Knayder Nałogowiec (37,640 p.)
Dobry kod, ale źle to trochę wytłumaczyłeś, przynajmniej rozumując z wiedzy jaką posiadam.
getline(cin, komunikat); pobiera wszystko co siedzi w buforze klasy streambuf zawartym w obiekcie klasy IStream, cin, a jeżeli jest pusty to prosi o jakieś wejście.
W kodzie który został podany w pytaniu, bufor cina jest czymś zapełniony więc program nie musi pytać o jego uzupełnienie i pobiera go z bufora, a metoda: cin.ignore() czyści tenże bufor.
To nie ma nic wspólnego z strumienie wyjścia o którym wspomniałeś.
Przynajmniej ja to tak rozumiem :\

EDIT: getline pobiera wszystko z bufora do znaku enter. ('\n')
komentarz 16 listopada 2016 przez Dubgron Mądrala (5,620 p.)
Literówka, chodziło mi oczywiście o strumień wejścia.
komentarz 16 listopada 2016 przez Knayder Nałogowiec (37,640 p.)
To dlaczego wspominasz o cout i printf?
komentarz 16 listopada 2016 przez Dubgron Mądrala (5,620 p.)

Poprawione. To z rozpędu, zacząłem pisać o strumieniu wyjścia i zamiast std::cin napisałem std::cout :D

komentarz 16 listopada 2016 przez Evelek Nałogowiec (28,960 p.)

Moja metoda, która podałem jest o tyle lepsza, bo występuje od razu w funkcji w której mogą nastąpić właśnie takie problemy. Jeśli wpiszemy std::cin.ignore(); do metody void decsribtion_on_start() , a potem będziemy chcieli zamienić w funkcji int main() kolejność metod to problem się powtórzy. Dlatego tak jak podałem w swoim sposobie, lepiej czyścić strumień wejścia od razu w metodzie, która tego wymaga, a nie potem dopisywać takie kombinacje do pozostałych funkcji. Mało praktyczne i kłopotliwe.

 

Powtórzę:

void when_activate()
    {
        cout<<"O ktorej ma byc uruchomiony alarm?"<<endl;
        cout<<endl<<"\tGodzina minuta sekunda: ";
        cin>>godzina_stop>>minuta_stop>>sekunda_stop;
        getchar();
    }

Lepsze i praktyczniejsze zastosowanie czyszczenia strumienia od razu w funkcji, która tego wymaga.

komentarz 16 listopada 2016 przez Knayder Nałogowiec (37,640 p.)
Evelek to jest jak najbardziej logiczne, tylko że nie zastanawialiśmy się za bardzo jak działa program, tylko co wywołuje błąd. W ten sposób umieściliśmy czyszczenie bufora przed jego użyciem.
komentarz 16 listopada 2016 przez Evelek Nałogowiec (28,960 p.)

Zgadza się, to też jest poprawne, jednak ja podszedłem bardziej praktycznie mi się wydaje i zwróciłem uwagę na ten ważny szczegół. smiley

komentarz 16 listopada 2016 przez Knayder Nałogowiec (37,640 p.)
Oczywiście :)
Tylko że można było nie zrozumieć twojego komentarza, ponieważ zamieściłeś kod bez jego wytłumaczenia.
A no i nie jestem do końca pewny czy funkcja getchar() pobiera ten char z bufora cina :?
Nawet jeżeli tak, to jest to tylko pojedynczy znak, a może się okazać tak, że w buforze zostało trochę więcej.

Znaczy to tyle, że najlepiej jest zastąpić getchar() na cin.ignore();
komentarz 16 listopada 2016 przez Evelek Nałogowiec (28,960 p.)

Masz rację. smiley

0 głosów
odpowiedź 16 listopada 2016 przez Evelek Nałogowiec (28,960 p.)

A czy przekazujesz funkcji description_on_start jakiś argument np. 'komunikat' aby mogła wywować funkcję getline? Chyba nie bardzo. smiley Bynajmniej tak mi się wydaje patrząc na kod, bo nie kompilowałem tego.

komentarz 16 listopada 2016 przez Konrad Nabożny Stary wyjadacz (13,460 p.)
W innych metodach nie przekazuję żadnych argumentów i wszystko śmiga jak należy.
komentarz 16 listopada 2016 przez Dubgron Mądrala (5,620 p.)
Po co ma przekazywać go jako argument, skoro jest on częścią klasy, w której jest ta metoda?

PS bynajmniej =/= przynajmniej
komentarz 16 listopada 2016 przez Evelek Nałogowiec (28,960 p.)
void when_activate()
    {
        cout<<"O ktorej ma byc uruchomiony alarm?"<<endl;
        cout<<endl<<"\tGodzina minuta sekunda: ";
        cin>>godzina_stop>>minuta_stop>>sekunda_stop;
        getchar();
    }

#include <stdio.h>

I po problemie. :)

komentarz 16 listopada 2016 przez Evelek Nałogowiec (28,960 p.)

Od razu mnie minusem zlinczowali. laugh

komentarz 16 listopada 2016 przez Konrad Nabożny Stary wyjadacz (13,460 p.)
Ok, ale w czym to ma mi pomóc?
komentarz 16 listopada 2016 przez Evelek Nałogowiec (28,960 p.)

Ta spacja w w funkcji when_activate powoduje niemożność użycia getline (cin, komunikat), bo zostaje w pamięci. smiley

komentarz 16 listopada 2016 przez Evelek Nałogowiec (28,960 p.)
W tym pomaga, bo możesz wpisać coś do zmiennej komunikat kolego?

Podobne pytania

0 głosów
0 odpowiedzi 528 wizyt
pytanie zadane 16 kwietnia 2022 w C i C++ przez PoebWKlapkach Nowicjusz (120 p.)
+2 głosów
1 odpowiedź 194 wizyt
pytanie zadane 12 lipca 2021 w C i C++ przez n0sk1llexe Początkujący (300 p.)
0 głosów
0 odpowiedzi 266 wizyt

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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!

...