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

getchar(); a cin.get();

Object Storage Arubacloud
+1 głos
28,734 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ź 17,346 wizyt
pytanie zadane 9 marca 2016 w C i C++ przez Munvik Dyskutant (9,350 p.)
0 głosów
2 odpowiedzi 647 wizyt
pytanie zadane 28 września 2019 w C i C++ przez enigmatycznyclay Bywalec (2,450 p.)
0 głosów
1 odpowiedź 331 wizyt
pytanie zadane 26 lipca 2016 w C i C++ przez Kyufujin Nowicjusz (120 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

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

...