반응형
이제 막 C에서 C++로 올라온 초보생입니다..

C++에서 인풋받을때 어떤때는 cin.get(asdfad); 으로 받고

어떤때는 cin >> asdasdf; 로 받던데..

둘의 차이점은 무엇이죠? 각각 언제 쓰는지....

그리고 cin.get()을 제대로 쓰는법도 알고 싶어요

어떤데에서는 parameter가 한개였다가, 두개였다가, 세개였다가 그러던데

cin.get(c);
cin.get(c, 3);
cin.get(c, 3, '@');

parameter 수는 자기 맘대로 해도 되는건가요?

자세한 설명 부탁드려요~

-----------------------------------------------------------------------------------

(우선 이런 유형의 C++을 배우시면서 궁금한 점은 C++ FAQ에 찾을 수 있습니다.)

cin이라는 것은 정확히 말하자면 istream이라는 클래스의 object입니다.
그 istream 클래스에는 get()이라는 함수도 있고,
operator>>()라는 함수도 있습니다.

님이 쓰시는 get()과 관련된 정의들은 다음과 같습니다.

int get(); // #0
istream& get(char* ptr, int len, char delim = '\n'); // #1
istream& get(unsigned char* ptr, int len, char delim = '\n'); // #2
istream& get(char& c); // #3
istream& get(unsigned char& c); // #4
istream& get(signed char& c); // #5
istream& get(signed char* ptr, int len, char delim = '\n'); // #6
istream& get(streambuf& sb, char delim = '\n'); // #7

답변을 하자면,

cin.get(c); // #3, #4, 또는 #5번을 c의 타입에따라 호출
cin.get(c, 3); // #1, #2, #7 또는 #7번을 c의 타입에따라 호출
cin.get(c, 3, '@'); // #1, #2, 또는 #6 번을 c의 타입에 따라 호출

보시는 바와 같습니다.

get()의 유형을 나누자면 4가지로 나눌 수 있는데요,

유형1:
-> int get();
유형2:
-> istream& get(char*, int len, char = '\n');
-> istream& get(signed char*, int len, char = '\n');
-> istream& get(unsigned char*, int len, char = '\n');
유형3:
-> istream& get(char&);
-> istream& get(signed char&);
-> istream& get(unsigned char&);
유형4:
-> istream& get(streambuf&, char = '\n');

유형1은 단순히 다음 문자, 또는 EOF를 읽어서 return 합니다.
유형2는 주어진 char*에 len만큼 문자를 읽어들이거나, EOF까지 읽거나,
'\n'이 올 때까지 읽어들입니다.
유형3은 char reference에 다음 한 문자를 읽어들입니다.
유형4는 streambuf에 '\n'문자가 올 때 까지 문자들을 읽어들입니다.

그리고 cin >> x;와 cin.get(x)의 차이도 궁금하시다고요..
istream에는 다음과 같은 함수들도 정의되어 있습니다.

istream& operator>>(char*);
istream& operator>>(unsigned char* p) { return operator>>((char*)p); }
istream& operator>>(signed char*p) { return operator>>((char*)p); }
istream& operator>>(char& c);
istream& operator>>(unsigned char& c) {return operator>>((char&)c);}
istream& operator>>(signed char& c) {return operator>>((char&)c);}
istream& operator>>(int&);
istream& operator>>(long&);
istream& operator>>(short&);
istream& operator>>(unsigned int&);
istream& operator>>(unsigned long&);
istream& operator>>(unsigned short&);
istream& operator>>(float&);
istream& operator>>(double&);
istream& operator>>(long double&);
istream& operator>>( __manip func);
istream& operator>>(__imanip func);
istream& operator>>(streambuf*);

즉 cin >> x;는 cin.operator>>(x); 와 같은 것이고, 보시다시피
get()보다 더욱더 많은 타입을 지원합니다.

get()과 operator>>()의 차이는 당연히 포맷이죠.

간단한 예를 들자면,

char c;
cin << c;

위 코드는 입력에서 white space (빈칸, tab, 등등) 을 무시하고
가장 처음오는 char형태의 입력을 c에 저장합니다.

char c;
cin.get(c);

위 코드는 빈칸이 입력되면 빈칸 자체를 c에 읽어들입니다.

예를들어, "Hello world"라는 입력을 읽는데 다음과 같이 하면,

char input[32];
cin >> input;

input에는 "Hello"만 들어갑니다. 즉 "Hello" 다음의 white space를
감지한 것이죠. 하지만 다음과 같이 하면,

char input[32];
cin.get(input,32);

이렇게 하면 input에는 "Hello world"가 모두 들어갑니다.

그리고 하나 추가적으로 얘기하고 싶은게 있다면...
get()을 쓰시던 operator>>()를 쓰시던 둘 다 미묘한(?) 내용들이 있으니
웹 검색을 하시거나 관련 문서를 참조하여 올바른 사용을 하시길 바랍니다.

밑에 잘못 사용된 예를 두개 첨부해봤습니다. 한번 공부해보세요. ^_^

예1:

#include

int main() {
int i = 0;
while (i != -1) {
cin >> i;
cout << "entered " << i << "\n";
}
}

예2:

#include

const static int STRING_SIZE = 32;

int main() {
char str1[STRING_SIZE], str2[STRING_SIZE];
cin.get(str1, STRING_SIZE, '\n');
cin.get(str2, STRING_SIZE, '\n');

cout << "str1 = " << str1 << "\n";
cout << "str2 = " << str2 << "\n";
}
반응형
Posted by Real_G