getline() / get()
단어 하나씩이 아니라 전체 어구를 하나의 문자열로 입력하기 위해 사용한다. (단어 단위의 문자열 입력이 아닌 행 단위의 문자열 입력)
전체 입력 행을 읽는다. (개행 문자가 나올 때까지 읽음)
getline()
Enter키에 의해 전달되는 개행 문자를 입력의 끝으로 간주하여 한 행 전체를 읽는다.
개행 문자를 읽어서 폐기한다. (개행 문자는 저장하지 않음)
문자열을 배열에 저장할 때 개행 문자는 널 문자로 대체된다.
cin.getline()을 함수 호출로 사용함으로써 이 메서드를 호출 할 수 있다.
호출 형태
두 개의 매개변수를 사용
🟠 매개변수 1 : 입력한 행을 저장할 배열의 이름
🟠 매개변수 2 : 입력받을 문자들의 한계 (Ex : 한계가 20이면 최대 19개까지 문자들을 입력받을 수 있음, 나머지 한자리는 널 문자를 예비함)
1
2
|
cin.getline(매개변수1, 매개변수2);
cin.getline(name, 20); // 예시
|
cs |
✅ 2Line 한 행 전체를 읽어 name 배열에 저장 (그 행에 있는 문자들의 개수는 최대 19개 또는 그 보다 적어야 함)
⚠️ 한계에 도달하거나, 한계 이전이라도 개행 문자를 읽으면 읽기를 중단한다 ⚠️
예제 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <iostream>
using namespace std;
int main()
{
const int ArSize = 20;
char name[ArSize];
char dessert[ArSize];
cout << "이름을 입력하세요 : \n";
cin.getline(name, ArSize);
cout << "좋아하는 디저트를 입력하세요 : \n";
cin.getline(dessert, ArSize);
cout << "맛있는 " << dessert;
cout << " 디저트를 준비하겠습니다." << name << "님! \n";
return 0;
}
|
cs |
[입력 값]
hyunzzang
cake
✅코드 설명✅
➡️ 11 Line 이 부분에서 입력할 때 hyun 띄어쓰기 zzang을 했지만 종료되지않고 한 행을 문자열로 입력받는다.
만약 cin.getline을 사용하지 않고 cin >> name; 이라고 코딩했을 때에는 아래와 같이 다음 입력을 무시한다.
get()
개행 문자를 읽어서 버리지 않고 입력 큐에 남겨둔다.
get()을 연달아 두 번 호출한다고 가정해보면,
1
2
|
cin.get(name, Arsize);
cin.get(dessert, Arsize); // 문제 발생
|
cs |
첫 번째 호출이 입력 큐에 개행 문자를 그대로 남겨두기 때문에, 두 번 호출은 그 개행 문자를 첫 문자로 만나게 된다.
그래서 get()은 읽을 것도 없이 곧 바로 행의 끝에 도달했다고 결론을 내린다. 따라서 특별한 조치를 취해주지 않는 한 get()은 개행 문자를 넘어갈 수가 없다.
1️⃣ get()을 사용하는 첫 번째 방법
➡️ 매개변수를 사용하지 않는 cin.get() 호출
1
2
3
|
cin.get(name, Arsize); // 첫 번째 행을 읽는다
cin.get(); // 개행 문자를 읽는다
cin.get(dessert, Arsize); // 두 번째 행을 읽는다
|
cs |
매개 변수를 사용하지 않는 cin.get()의 호출은 그것이 개행 문자이든 다른 무엇이든지 간에 무조건 문자 하나를 읽는다.
cin.get()을 사용하면 개행 문자를 읽어서 처리하고, 다음 행의 입력으로 넘어가게 할 수 있다.
2️⃣ get()을 사용하는 두 번째 방법
➡️ 두 개의 클래스 멤버 변수를 결합하여 사용
1
|
cin.get(name, Arsize).get(); // 멤버 함수들을 결합한다
|
cs |
이렇게 사용하면 cin.get(name, Arsize)가 cin객체를 리턴한다. 리턴 된 cin 객체는 뒤에 결합된 get() 함수를 호출하는 객체로 사용된다.
비슷한 원리의 구문
1
|
cin.getline(name1, Arsize).getline(name2, Arsize);
|
cs |
두 행의 입력을 연속해서 읽어 name1과 name2 배열에 각각 저장 (cin.getline()을 두 번 호출하는 것과 같음)
getline() 보다 get()를 사용해야 하는 이유
🔵 구식 C++에는 getline()이 없다.
🔵 get()이 사용자를 다소 신중하게 만들기 때문이다.
🔵 getline()은 사용자가 좀 더 편하지만 get()이 에러 체킹이 좀 더 쉽기 때문이다.
출처 및 참고 : C++ 기초 플러스
HyunZzang의 프로그래밍 공간 / 함께 공부해요!!
도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 부탁드립니다 :)