istream& getlilne(char* s, streamsize n);
istream& getline(char* s, streamsize n, char delim);
s
: C 형식 문자열을 저장할 배열을 가리키는 포인터n
: 저장할 문자의 최대 개수 (끝의 종료 널 문자를 포함한 값)delim
: 제한자로 이 문자에 도달시 추출이 중단됨. 이 때 이 문자는 s에 기록되지는 않지만 스트림에서 사라진다.
- n-1개의 문자만큼 읽어와서 s에 저장
delim
을 별도로 지정하지 않으면 엔터('\n')로 인식하기 때문에n
이 클 경우s
에는 한 줄이저장된다.delim
을 지정하면 그 제한자(delim) 문자 직전까지 읽어다가s
에 저장한다.
#include <iostream>
int main(){
char greeting[100];
cout << "say sth: ";
cin.getline(greeting, 10); // 10자를 입력받아 greeting 변수에 저장 (마지막은 항상 \0 => 실질적으로 9자 저장)
cout << "greeting console: " << greeting << "\n";
}
istream& getline(istream& is, string& str);
istream& getline(istream& is, string& str, char delim);
is
: 입력 스트림 오브젝트 (ex. cin)str
: 입력받은 문자열을 저장할 string 객체delim
: 제한자로 이 문자에 도달 시 추출이 중단됨. 이 떄 문자는 s에 기록되지 않지만 스트림에서 사라진다.#include <iostream>
#include <string>
int main(){
string greeting;
getline(cin, greeting);
cout << "greeting console: " << greeting << "\n";
}
cin은 입력값의 기준을 띄어쓰기, 엔터, 탭 등으로 나눈다.
때문에 띄어쓰기, 엔터, 탭 등의 문자가 나오면 무시하는 대신 버퍼에 남긴다.
getline은 엔터('\n')를 무시하지 않고 잡는다.
때문에 cin 이후에 버퍼를 비워주는 함수(cin.ignore()
)를 실행해서 버퍼를 비워준 후 getline으로 입력을 받아야 한다.
C언어 문자열 istream::getline()과 C++ string의 getline()! 한 줄 읽는 함수가 두 개?