상세 컨텐츠

본문 제목

[C++] 표준 입출력 버퍼 , 코딩테스트 입출력 cin, cin.get(), getline()

Study/Tip notes

by Arq.Dev5igner 2023. 10. 19. 00:01

본문

1.cin.getline()

  • cin.getline()에 쓰이는 getline은 public member function이라는 설명이 있다.
  • 소속이 std::istream::getline이다. 즉 istream 클래스의 멤버함수로써 getline이 존재한다. 따라서 istream의 객체들은 getline 멤버함수를 호출해서 사용할 수 있다.
  • 정의
    1. 첫번째 파라미터로 c-string의 문자들을 저장할 수 있는 char형 배열의 시작주소를 요구한다.
    2. 두번째 파라미터로, s의 주소에 찾아가서 저장할 문자들의 용량을 정해야한다.(10이라 적으면 9개의 문자들이 저장될 수 있다 마지막은 \0 널이 들어가야 하므로)
    3. 세번째 파라미터로, 제한자(delim)을 입력할 수 있다. cin 객체로부터 값을 입력받아서 스트림을 통해 배열에 값을 입력할 때, 제한자를 만나면 제한자까지만 값을 넣어준다.
  • istream& getline (char* s, streamsize n );
    istream& getline (char* s, streamsize n, char delim );
    

 

예시

#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);
    
    1. 오버로딩된 함수의 종류가 다양하지만 크게 살펴보자.
    2. 첫번째 파라미터로 istream 객체를 참조의 형태로 받는다. 인터넷에 있는 예제들에 첫번째 파라미터로 주로 cin을 넣는데 cin은 istream 클래스의 객체이므로 cin이 들어갈 수 있는 것이다. (콘솔에서 입력 받은 값을 저장하는 목적도 있지만)
    3. 두번째 파라미터로 cin.getline()에 쓰이는 getline()과 달리 자료형이 std::string인 객체를 받는다. cin.getline()의 경우 값을 저장하는 공간이 char 형 배열이었지만, 일반함수인 getline()은 string 객체에 값을 저장한다. (이게 큰 차이인것 같다)
    4. 세번째 파라미터로 제한자를 받는 다는 점은 동일하다

 

예시

#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만이 출력 출력됨을 확인 할 수 있다.



결론

—-> 내가 키보드로 입력한 값을 배열에 저장하겠다 : cin.getline()

—-> 내가 키보드로 입력한 값을 string 객체에 저장하겠다 : 그냥 getline()

'Study > Tip notes' 카테고리의 다른 글

[GAMEAI] FSM을 이용한 몬스터 인공지능의 구현  (0) 2022.11.30
디자인 패턴 요약  (0) 2022.11.29
[C++] 참조(레퍼런스) 변수 정리  (0) 2022.02.25

관련글 더보기