c++에는 입력받는 방법이 여러 가지 있는데, 그 중 키보드로 사용자에게 입력받는 방법 중, c언어 형태의 입력이 아닌 c++형태의 입력 방법 몇 가지를 알아보고자 한다.
1. cin
가장 흔하게 사용하는 std::cin이다.
#include <iostream>
using namespace std;
int main() {
char a[10];
cin >> a; // "hello lee" 입력
cout << a;
return 0;
}
위처럼 C언어에서 다루는 문자열처럼 char에 입력을 받는다고 할 때, "hello lee"같이 띄어쓰기가 있는 경우, 띄어쓰기도 입력 종료의 한 부분으로 판단 해 배열 a에는 "hello"만 들어가고, 출력도 "hello"만 되는 것을 볼 수 있다.
char배열이 아닌 string으로 해도 마찬가지이다.
즉, 공백과 개행문자를 입력받을 수 없다.
참고로 cin은 처음 입력 된 띄어쓰기, 탭, 개행문자는 무시한다.
2. get
해당 메소드는 std::istream::get이며, 문자만 입력받거나 문자열로 입력받을 수 있다.
프로토타입은 istream& get(char* s, streamsize n, char delim); 이다.
s: 문자열을 받을 배열을 가리키는 포인터
n: 저장할 문자의 최대 갯수
delim: 제한자로, 지정한 문자가 나타나면 입력을 멈춘다. 대신 제한자는 저장하지 않는다.
n을 빼면 문자만 입력받을 수 있다.
delim을 빼면 개행문자(엔터)로 자동 설정 된다.
n을 뺐다면 문자열이 아닌 문자를 입력받기에, delim도 설정할 수 없다.
즉, 문자를 입력받기 위해서는 인자로 s만 주면 되고, 문자열을 입력받기 위해서는 n과 delim을 추가하면 된다.
include <iostream>
using namespace std;
int main() {
char a, b, c;
cin.get(a);
cin.get(b);
cin.get(c);
// a는 'a', b는 ' ', c는 b가 들어있음
cout << a << ' ' << b << ' ' << c;
return 0;
}
문자만 입력 받을 수 있게 해보자. char타입으로 변수 3개를 만든다.
각자 cin.get()을 사용 해 a, b, c 변수에 'a', 'b', 'c'를 넣기 위해서 "a b c"라고 입력한다.
근데 a, b, c를 출력 해 보니 "a b"라고 출력된다.
cin과 다르게 ' '(띄어쓰기)가 입력 종료가 아닌 문자로 받아들여서 b에 ' '가 들어간 것이다.
아래는 문자가 아닌 문자열로 입력받는 경우이다.
#include <iostream>
using namespace std;
int main() {
char a[10];
cin.get(a, 10, '.');
cout << a << '\n';
return 0;
}
"hello lee.qwe"를 입력했고, 제한자인 '.'을 만나고 저장하기를 멈춘다.
또한 cin과 다르게 ' '(띄어쓰기)또한 문자로 인식 해 저장되는 것을 볼 수 있다.
3. getline
- getline은 두 가지의 형태가 있다.
- std::istream::getline의 cin.getline()과 std::getline(string)이다.
std::istream::getline의 cin.getline()
프로토타입은 itream& getline(char* s, streamsize n, char delim); 이다.
s: 문자열을 받을 배열을 가리키는 포인터
n: 저장할 문자의 최대 갯수
delim: 제한자로, 지정한 문자가 나타나면 입력을 멈춘다. 대신 제한자는 저장하지 않는다.
제한자를 지정하지 않을 수도 있는데, 그렇다면 개행문자(엔터)로 자동 설정 된다.
#include <iostream>
using namespace std;
int main() {
char a[20];
cin.getline(a, 15, '.');
cout << a << '\n';
return 0;
}
위처럼 "hello lee.qqq"를 입력했지만, 제한자인 '.'을 만나고 저장하기를 멈춘다.
또한 cin과 다르게 ' '(띄어쓰기)또한 문자로 인식 해 저장되는 것을 볼 수 있다.
참고로 cin.getline()의 첫 인자는 문자열을 받을 배열의 포인터이기에 string타입에 입력받으려고 하면 안된다.
그 때 두 번째의 getline을 사용하면 된다.
std::getline(string)
프로토타입은 istream& getline(istream& is, string& str, char delim); 이다.
is: 문자들이 추출되어질 istream(입력 스트림)오브젝트(키보드 입력을 받을거면 cin 쓰면 된다.)
str: 입력받은 문자열들이 저장될 string 오브젝트
delim: 제한자로, 지정한 문자가 나타나면 입력을 멈춘다. 대신 제한자는 저장하지 않는다.
제한자를 지정하지 않을 수도 있는데, 그렇다면 개행문자(엔터)로 자동 설정 된다.
#include <iostream>
using namespace std;
int main() {
string str;
getline(cin, str, ';');
cout << str << '\n';
return 0;
}
이번에는 제한자를 ';'로 설정했다. "hello lee;qqq"를 입력하고, 제한자인 ';'을 만나고 저장하기를 멈춘다.
이번에도 cin과 다르게 ' '(띄어쓰기)또한 문자로 인식 해 저장되는 것을 볼 수 있다.
해당 형태의 getline메소드는 두 번째 인자로 string타입을 넣어야하기에 char배열은 안된다.
결론
cin은 입력받기에 편한 메소드지만, 공백이 포함된 문자열을 받기에는 부적절하니, get, getline 메소드를 적절하게 활용하는 것이 좋다.
참고
std::istream::get
https://www.cplusplus.com/reference/istream/istream/get/?kw=istream%3A%3Aget
std::istream::getline
https://www.cplusplus.com/reference/istream/istream/getline/
std::getline(string)
'개발 > C, C++' 카테고리의 다른 글
[C++] 참조자(Reference), 포인터와 차이점, 사용법 (0) | 2022.06.10 |
---|---|
[C++] namespace란? (0) | 2022.06.10 |
[C++] 배열 최대값, 최소값 구하기 (0) | 2022.04.18 |
[C++] 배열 정렬하기 (0) | 2022.04.18 |
온라인저지(백준) 문제 풀이 시 주의사항 (0) | 2022.04.08 |