cin.getline()과 getline() 비교
출처 : https://www.cplusplus.com/reference/string/string/getline/?kw=getline
출처 : https://www.cplusplus.com/reference/istream/istream/getline/
공부를 하던 도중
cin.getline()과 getline()의 차이가 무엇인지 궁금해졌다.
1.cin.getline()
cin.getline()에 쓰이는 getline은 public member function이라는 설명이 있다.
소속이 std::istream::getline이다. 즉 istream 클래스의 멤버함수로써 getline이 존재한다. 따라서 istream의 객체들은 getline 멤버함수를 호출해서 사용할 수 있다.
정의
istream& getline (char* s, streamsize n ); istream& getline (char* s, streamsize n, char delim );
- 첫번째 파라미터로 c-string의 문자들을 저장할 수 있는 char형 배열의 시작주소를 요구한다.
- 두번째 파라미터로, s의 주소에 찾아가서 저장할 문자들의 용량을 정해야한다.(10이라 적으면 9개의 문자들이 저장될 수 있다 마지막은 \0 널이 들어가야 하므로)
- 세번째 파라미터로, 제한자(delim)을 입력할 수 있다. cin 객체로부터 값을 입력받아서 스트림을 통해 배열에 값을 입력할 때, 제한자를 만나면 제한자까지만 값을 넣어준다.
예시
#include <iostream>
#include <string>
using namespace std;
int main()
{
char test[300];
cin.getline(test, sizeof(test));
char test_delim[300];
cin.getline(test_delim, sizeof(test_delim),' ');
cout << test << endl;
cout << test_delim << endl;
return 0;
}
출력
test 배열에 경우 제한자가 없기 때문에 abcdefg(스페이스입력)hijk를 입력하면 cin을 통해 입력된 값이 test 배열에 스페이스까지 포함하여 전부 입력된다
반면에 test_delim 배열은 제한자로 스페이스 ‘ ‘가 있으므로 ABCD(스페이스)EFG를 하면 cin에 스페이스가 입력되기 이전 값인 ABCD만 test_delim 배열에 입력되어 ABCD만 출력된다.
2. getline()
- 그냥 getline()은 일반함수라는 설명이 있다.
- 소속은 std::getline(string)이다. std namespace에 선언된 일반함수이다.
- 정의
(1) istream& getline (istream& is, string& str, char delim); istream& getline (istream&& is, string& str, char delim); (2) istream& getline (istream& is, string& str); istream& getline (istream&& is, string& str);
- 오버로딩된 함수의 종류가 다양하지만 크게 살펴보자.
- 첫번째 파라미터로 istream 객체를 참조의 형태로 받는다. 인터넷에 있는 예제들에 첫번째 파라미터로 주로 cin을 넣는데 cin은 istream 클래스의 객체이므로 cin이 들어갈 수 있는 것이다. (콘솔에서 입력 받은 값을 저장하는 목적도 있지만)
- 두번째 파라미터로 cin.getline()에 쓰이는 getline()과 달리 자료형이 std::string인 객체를 받는다. cin.getline()의 경우 값을 저장하는 공간이 char 형 배열이었지만, 일반함수인 getline()은 string 객체에 값을 저장한다. (이게 큰 차이인것 같다)
- 세번째 파라미터로 제한자를 받는 다는 점은 동일하다
예시
#include <iostream>
#include <string>
using namespace std;
int main()
{
string myString;
getline(cin, myString);
string mydelimString;
getline(cin, mydelimString, ' ');
cout << myString << endl;
cout << mydelimString << endl;
return 0;
}
출력
- 첫번째 파라미터로 cin을 썼다. istream의 객체인 cin을 통해 콘솔 입력을 받을 수 있다.
- cin.getline()과 달리 string의 객체(myString, mydelimString)이 들어가 있음을 확인할 수 있다
- 구분자를 스페이스 ‘ ‘로 했기 때문에 두 번째 mydelimString의 경우 출력하면 HELLO WORLD가 아닌 스페이스 이전에 cin을 통해 스트림에 입력되었던 HELLO만이 출력 출력됨을 확인 할 수 있다.