logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Switch w C++ - brak możliwości wpisania ciągu znaków w case 1

pag15 25 Gru 2015 19:23 1038 4
REKLAMA
  • #1 15269138
    pag15
    Poziom 7  
    Posty: 38
    Witam wszystkich, pisałem ostatnio program do podmiany danych, zastosowałem switch i cos nie chodzi jak bym chciał, umieszczam kawałek surowego kodu który nie dziala jak chce, moge mi ktoś powiedzieć dlaczego po wpisaniu w cin 1 i przejścia do case 1 program się kończy a nie daje mi wpisać w cin ciągu znaków ? Co robię źle ?


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #2 15269325
    Visher
    Poziom 10  
    Posty: 16
    Pomógł: 1
    Ocena: 4
    Problem jest w tym, że na początku korzystasz z cin >> x, a następnie wywołujesz funkcję getline.

    Wynika to z tego, że cin >> x, wczytuje z bufora klawiatury to co wciskałeś w klawiaturę: najpierw klawisz '1', a później klawisz 'enter'. Z cin jest taki problem, że on odczyta sobie tą jedynkę, przetworzy ją i zwróci, ale zostawi w buforze ten wciśnięty 'enter'.

    Gdy później wywołujesz getline, który działa inaczej niż cin >> x - on nie ignoruje tego entera, tylko go odczytuje. Programowi się wydaje, że wpisałeś cyfrę, a później gdy zapytał o wpisanie tekstu, Ty wcisnąłeś enter i on właśnie to odczytał. Napis 'a' jest w rezultacie pustym napisem.

    Jak to rozwiązać? Przed getline umieść cin.ignore(). Spowoduje on zignorowanie wszystkiego co jest w buforze do następnego "ogranicznika" włącznie (którym jest enter)

    Mam nadzieję że rozwiąże to problem :)
  • REKLAMA
  • #3 15269345
    pag15
    Poziom 7  
    Posty: 38
    Jesteś wielki ! Działa ale mi to nie wystarcza mi wiedzy :P, a można jakoś ten bufor wyczyścić czy ignore jest tutaj jak najbardziej na miejscu ?
  • REKLAMA
  • #4 15269381
    Visher
    Poziom 10  
    Posty: 16
    Pomógł: 1
    Ocena: 4
    cin.ignore() właśnie do tego służy.

    Cytat:
    istream& ignore (streamsize n = 1, int delim = EOF);

    Extract and discard characters

    Extracts characters from the input sequence and discards them, until either n characters have been extracted, or one compares equal to delim.

    [..]

    Delimiting character: The function stops extracting characters as soon as an extracted character compares equal to this.
    Note that the delimiting character is extracted, and thus the next input operation will continue on the character that follows it (if any).

    Czyli: cin.ignore() wydobywa znaki z wejścia (u Ciebie jest to klawiatura) i zapomina o nich, ale nie więcej niż n znaków, lub nie dalej niż do znaku delim (włącznie).

    Ponieważ nie podajesz żadnych argumentów do cin.ignore(), domyślnie delim to znak końca wejścia (pliku, strumienia), a ilość znaków n jest równa 1. Funkcja zatrzyma się gdy w wejściu nie ma już żadnych znaków.

    Opis z: http://www.cplusplus.com/reference/istream/istream/ignore/, tam jest jeszcze parę informacji więcej na ten temat
  • #5 15269440
    pag15
    Poziom 7  
    Posty: 38
    Dziękuję uprzejmie, takiej wiedzy potrzebowałem, teraz już nie będę miał z tym problemu pisząc. :)
REKLAMA