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;