[C++] C++ 입력 함수 정리

Doorbals·2023년 1월 5일
0

CPP

목록 보기
5/16

1. cin

  • <iostream> 헤더에 정의되어 있는 입력 스트림 객체이다.
  • 표준 입력 버퍼에서 개행 문자를 제외한 값을 가져온다.
  • 공백이나 개행 문자와 같은 화이트 스페이스 문자 가 있을 시 이전까지의 값만 결과로 받아들인다.
  • 이전까지의 값만 받아들이기 때문에 공백, 개행, 탭 등 화이트 스페이스 문자는 입력 버퍼에 그대로 남아있다.
#include <iostream>
using namespace std;

int main()
{
	string str;
	cin >> str;

	cout << str;	
}

입력 : Hi Hello
출력 : Hi
  • 만약 cin으로 공백이 있는 문자열을 입력 받으면 공백 이전까지의 문자열만 변수에 저장되고 그 이후 부분은 입력 버퍼에 남아있다. 이후 다시 cin을 실행하면 문자열을 입력 받지 않고 입력 버퍼에 있는 값이 자동으로 변수에 할당된다.
int main()
{
	string str;
	
	for (int i = 0; i < 2; i++)
	{
		cin >> str;
		cout << str << endl;
	}
}

입력 : Hi Hello
출력 : Hi	  
	   Hello
       => 입력을 두 번 받지 않고, 입력 버퍼에 남아있던 Hello가 자동으로 저장됨.

2. getline()

❗getline()은 <istream>에 속한 cin.getline()과 <string>에 속한 getline() 두 가지로 나뉜다.

1) <istream> cin.getline()

#include <istream>
// cin.getline(변수 주소, 최대 입력 가능 문자 수, 제한자)
cin.getline(char* str, streamsize n, char dlim);
  • C 형식 문자열 방식인 마지막 글자에 'NULL' 문자가 포함된 문자 배열(char[], char*)을 받는 데에 사용한다.
  • n - 1개의 문자를 읽어와 str에 저장하고, 마지막 문자는 자동으로 NULL로 바꾼다.
  • 세 번째 인자 dlim(제한자) 직전까지 읽어 str에 저장하는데, 별도 지정 없을 시 '\n'으로 처리한다.
#include <iostream>
#include <istream>

using namespace std;

int main()
{
	char str[5] = {0, 0, 0, 0, 0};

	cin.getline(str, 5);
	cout << str;
}

입력 : 12345
출력 : 1234
=> (n-1) = (5-1) = 4개의 문자를 읽어와 str에 저장하고 마지막 문자는 NULL로 변경
int main()
{
	char str[5] = {0, 0, 0, 0, 0};

	cin.getline(str, 5, '3');
	cout << str;
}

입력 : 12345
출력 : 12
=> 제한자인 '3' 직전까지의 문자열인 12만 저장됨.

2) <string> getline()

#include <string>
// getline(입력스트림 객체, string 객체, 구분자)
getline(istream& stream, string str, char dlim)
  • 지정한 구분자(dlim)를 만날 때까지 문자열을 입력받아 string에 저장한다.
  • 구분자는 지정하지 않아도 된다.
#include <iostream>
#include <string>

using namespace std;

int main()
{
	string str;

	getline(cin, str);
	cout << str;
}

❗getline()을 사용할 때 주의할 점

int main()
{
	int n;
	string str;

	cin >> n;
	getline(cin, str);

	cout << str;
}

입력 : 123
출력 : 

위와 같은 상황에서 cin으로 n에 값을 할당하기 위해 정수를 입력하고 엔터(\n)를 치게 된다.
이 때 입력 버퍼에 \n가 남아있어 getline()에서 \n를 받아 str에 삽입하게 된다.
때문에 n을 입력 받은 후 getline()을 통해 문자열을 입력받지 않고 다음 코드로 넘어가게 된다.

int main()
{
	int n;
	string str;

	cin >> n;
    cin.ignore();
	getline(cin, str);

	cout << str;
}

입력 : 123
	   abc
출력 : abc

이를 해결하기 위해 cin >>n; 다음에 cin.ignore();를 추가해 입력 버퍼에 있는 모든 내용을 제거해준다. 이 경우 정상적으로 getline()이 실행된다.


3. cin.get()

#include <iostream>
char ch1;
ch1 = cin.get();
  • 표준 입력 버퍼에서 하나의 문자를 가져온다.
  • 문자 하나만 입력이 가능하며, 공백과 개행 등 화이트 스페이스 문자도 입력으로 포함한다.

👁️‍🗨️ 참조
https://kyu9341.github.io/C-C/2020/01/17/C++getline()/
https://velog.io/@jxlhe46/C-getline-%ED%95%A8%EC%88%98
https://novlog.tistory.com/78

profile
게임 클라이언트 개발자 지망생의 TIL

0개의 댓글