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

getchar(); a cin.get();

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
+1 głos
29,628 wizyt
pytanie zadane 24 grudnia 2015 w C i C++ przez enigmatycznyclay Bywalec (2,450 p.)
Czy są między nimi jakieś różnice?

2 odpowiedzi

+29 głosów
odpowiedź 24 grudnia 2015 przez Sebastian Fojcik Nałogowiec (43,040 p.)
edycja 5 grudnia 2020 przez Sebastian Fojcik
 
Najlepsza

Obydwie funkcje robią to samo, ale w inny sposób. Spróbuję Ci wyjaśnić.

getchar() jest to funkcja pochodząca z biblioteki <cstdio>, literka 'c' w nazwie biblioteki oznacza, że jest pochodzi ona z języka C. Język C nie posiada obiektowości, nie posiada w takim razie strumieni cin i cout
W języku C wszystko opiera się na funkcjach, a getchar() to jest po prostu odpowiednik cin.get() w języku C.
Przykład użycia getchar():

#include <cstdio>

char znak = getchar();

Deklaracja wygląda tak: int getchar();
Typ zwracany int to jest kod pobranego znaku.

Teraz cin.get().
Jeśli znasz już obiektowość, to wiesz, że get() to jest funkcja składowa wywoływana na rzecz obiektu cin
Funkcja get() jest o wiele bardziej rozbudowana. Potrafi pobrać jeden znak, łańcuch znaków lub wczytywać dopóki nie napotka danego znaku.
Funkcja get() pochodzi z biblioteki <iostream> tak więc jest rodowitym bytem z C++. Również użycie funkcji jest trochę inne. Aby wczytać znak postępujemy troszku inaczej niż z getchar(). Spójrz na przykład:

Sposób pierwszy:

char znak = cin.get();

Sposób drugi:

char znak;
cin.get( znak );

Można też wczytać przykładowo 20 znaków do tablicy: (jeśli napotka znak nowej linii (enter) '\n', to kończy wczytywanie

char tablica[ 20 ];
cin.get( tablica, 20 );

Jeżeli wczytujemy z pliku, to możemy odczytywać znak po znaku dopóki nie napotkamy końca pliku:

ifstream plik("plik.txt");
char znak;

while( plik.get( znak ) )
{
    cout << "Wczytano znak: " << znak << endl;
}

Inne użycie: wczytujemy znaki do tablicy o podanym rozmiarze aż do napotkania znaku 'X'.

char tablica[ 100 ];
cin.get( tablica, 100, 'X' );

Zastosowań jest jeszcze więcej, ale rzecz w tym, że getchar() pochodzi z C. cin.get() to już byt współczesny i nieco bardziej udoskonalony. W skrócie: nie ma takiej rzeczy, którą robi getchar(), a której nie robi cin.get().

Deklaracje w tym przypadku są inne, bo funkcja jest przeładowana kilkakrotnie:

int get()
tutaj funkcja zwraca int, który będzie kodem wczytanego znaku. Tak samo jak getchar().

istream & get(char & znak )
tutaj funkcja przyjmuje w argumencie referencję do znaku (& znak). Do tej zmiennej zapisze wczytany znak.

istream & get( char* tablica, streamsize rozmiar, char ogranicznik = '\n' )
funkcja wczytuje do tablicy po kolei znaki aż do napotkania znaku 'ogranicznik'.

istream& get (streambuf& bufor)
ta wersja funkcji pozwala na wczytywanie znak po znaku z jakiejś zmiennej będącej strumieniem. Na przykład pokazane wcześniej wczytywanie z pliku.

Ważna uwaga. We wszystkich przypadkach za wyjątkiem pierwszym funkcja cin.get() zwraca referencję do strumienia na rzecz którego jest wywołana. W przykładach powyżej jest to zawsze cin. Jakie ma to znaczenie? Ano takie, że dzięki temu można cin.get() użyć w warunku pętli lub if'ie. Co więcej można łańcuchować wywołanie get() i wczytać kilka znaków w jednej instrukcji.

char c1, c2, c3;

cin.get(c1).get(c2).get(c3);

// to prawie to samo co:
cin >> c1 >> c2 >> c3;

 

1
komentarz 24 grudnia 2015 przez efiku Szeryf (75,160 p.)
edycja 24 grudnia 2015 przez efiku
Moim zdaniem należy się naj. Odp:) wiadro plusow dla Pana ;)
1
komentarz 24 grudnia 2015 przez Frendom Pasjonat (18,900 p.)
i to jest prawdziwa odpowiedz! Bardzo milo sie czytalo
1
komentarz 24 grudnia 2015 przez Sebastian Fojcik Nałogowiec (43,040 p.)

Ohhh, zaraz się rozkleję :-D

Musiałeś czytać wersję po 15 edycjach. Dopiero teraz to jest readable laugh

0 głosów
odpowiedź 24 grudnia 2015 przez niezalogowany
edycja 24 grudnia 2015

Różnica jest taka, że getline() pobiera cały wiersz do napotkania znaku nowej linii i usuwa ten znak, a get() zostawia ten znak w strumieniu ~cpp0x http://cpp0x.pl/kursy/Kurs-C++/Ciagi-znakow-lancuchy/299

Pomyliły mi się pojęcia ;)

komentarz 24 grudnia 2015 przez Sebastian Fojcik Nałogowiec (43,040 p.)

Nie było wzmianki o getline. Czytamy uważniej wink

komentarz 24 grudnia 2015 przez niezalogowany
Ale nie chodziło o getline tylko o getch
komentarz 24 grudnia 2015 przez niezalogowany
Sorka, źle zapamiętałem :D Już "znikam" moją odpowiedź ;)
komentarz 24 grudnia 2015 przez Sebastian Fojcik Nałogowiec (43,040 p.)
edycja 24 grudnia 2015 przez Sebastian Fojcik
@badbullpl
getch() to jeszcze całkowicie inna funkcja pochodząca z całkowicie innej biblioteki <conio.h>. O niej też nie była w tym wątku żadnej wzmianki. Autor pyta o getchar() oraz cin.get()... ludzie :-P

@filipekczek7
"a get() zostawia ten znak w strumieniu"
Nope. Funkcja wyjmuje znak ze strumienia i umieszcza go w podanej zmiennej.
komentarz 24 grudnia 2015 przez niezalogowany

@Sebastian Fojcik -

a get() zistawua teb zbaj w strumieniu

Czemu to dałeś w cudzysłów? Ja takiego czegoś nie powiedziałem :D To chyba jakiś kosmita ;) A tak serio, to ja to wziąłem z cpp0x, nie moje słowa ;)

komentarz 24 grudnia 2015 przez Sebastian Fojcik Nałogowiec (43,040 p.)
Hahaha, ja zaznaczyłem Twój fragment, Ctrl+C i Ctrl + V. Nie sprawdziłem co się wkleiło.

Ej serio,jak to możliwe? :DDDDD
Przecież zawsze robię tak: piszę: "" potem kursor ustawiam pomiędzy znaki cudzysłowów i wciskam Ctrl+V... dziwne...dziwne... Illuminati? XD
komentarz 24 grudnia 2015 przez niezalogowany
Oj tak, to sprawa masonów :D
komentarz 24 grudnia 2015 przez niezalogowany
Kurde też mi się pomyliło :P
komentarz 24 grudnia 2015 przez niezalogowany
Nie no, to to już jest magia świąt :D Ok, kończymy dyskusję, wesołych świąt ;)

Podobne pytania

0 głosów
1 odpowiedź 18,695 wizyt
pytanie zadane 9 marca 2016 w C i C++ przez Munvik Dyskutant (9,350 p.)
0 głosów
2 odpowiedzi 855 wizyt
pytanie zadane 28 września 2019 w C i C++ przez enigmatycznyclay Bywalec (2,450 p.)
0 głosów
1 odpowiedź 399 wizyt
pytanie zadane 26 lipca 2016 w C i C++ przez Kyufujin Nowicjusz (120 p.)

93,444 zapytań

142,436 odpowiedzi

322,698 komentarzy

62,806 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

...