cin 관련 함수
- cin.fail()
- cin 을 이용하여 입력받는 경우, 올바르지 않은 시도가 발생했을 때 failbit를 설정하며 true를 반환한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
int main() {
int number;
cin >> number;
if (cin.fail()) {
cout << "오류가 발생하였습니다." << endl;
}
return 0;
}
|
cs |
int형 변수 number에 숫자가 아닌 문자를 넣어 fail() 함수가 true를 반환한 것이다.
- cin.clear()
- cin 은 현재 입력의 성공여부와 같은 상태를 비트 플래그로 저장한다. clear() 함수는 해당 비트 플래그를 초기화해주는 함수이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
int main() {
int number;
cin >> number;
if (cin.fail()) {
cin.clear();
cout << "오류가 발생하였습니다." << endl;
}
return 0;
}
|
cs |
cin.fail() 함수가 설정한 failbit을 초기화 하기 위해 cin.clear() 함수를 함께 사용해주었다.
위와 같이 cin.fail()과 cin.clear() 함수는 주로 함께 사용된다.
- cin.ignore(streamsize _Count, int_type _Metadelim)
- cin 으로 값을 입력받는 경우, 값을 바로 변수에 대입하는 것이 아니라 입력받은 값을 먼저 입력버퍼에 저장하게 된다. 그 후, 입력버퍼의 값을 읽어 변수에 대입하는 것이다.
- 입력버퍼에서 값을 읽어들일 때, 공백 및 개행문자 전까지만 읽어들이기 때문에 버퍼에는 공백이나 개행문자가 남는다.
- cin 뒤에 이어서 cin을 사용할 경우, 입력 버퍼에 남아있던 공백 및 개행문자를 무시하기 때문에 버퍼를 비워줄 필요가 없다.
- 하지만 cin 뒤에 cin.getline() 함수를 사용할 경우, getline() 함수는 공백 및 개행문자를 포함하여 입력을 받기 때문에 버퍼를 비워주어야 한다.
- 여기서 버퍼를 비워주는 역할을 하는 것이 cin.ignore() 함수이다.
- 버퍼에 저장된 데이터를 _Count 크기 만큼 읽어들이라는 의미이며, _Metadelim에 입력된 문자를 찾으면, 입력 버퍼의 처음부터 해당 문자까지 찾아서 그 부분을 모두 삭제하여 준다.
- 첫번째 인자 _Count 에는 읽어들일 버퍼의 크기
- 두번째 인자 _Metadelim 에는 찾을 문자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
int main() {
int number;
cin >> number;
if (std::cin.fail()) {
std::cin.clear();
std::cin.ignore(1024, '\n');
}
return 0;
}
|
cs |
cin.ignore(1024, '\n') 을 확인해보자
우선 1024라는 충분한 크기를 주어서 입력 버퍼를 읽어들이게 하고, 그 사이에 '\n' 문자를 찾는다면 입력 버퍼의 처음부터 해당 문자까지 모두 삭제하는 함수이다.
cin의 예외처리를 12~15 라인처럼 사용할 수 있다.
- cin.getline(char *str, streamsize n, char dlim)
- cin은 입력버퍼의 공백 혹은 개행문자 직전까지만 값을 읽어들인 후 변수에 대입한다.
- 문자열과 같이 공백이 포함된 값을 입력받기 위해 사용하게 된다.
- cin 뒤에 cin.getline() 함수를 사용할 경우, cin을 사용하고 남은 입력버퍼에 '\n' 이 저장되어 있고 cin.getline() 함수는 이것을 읽어들여 문제가 발생할 수 있다.
- 따라서 cin 뒤에 cin.getline() 함수를 사용한다면 cin.ignore() 함수와 함께 사용하는 것이 좋다.
- cin.getline() 함수는 첫번째 인자인 str에 사용자가 입력한 문자를 최대 n-1개까지 입력받는데 사용된다.
- 문자열의 마지막은 '\n' 이어야 하므로 사용자로부터 입력받을 문자는 최대 n-1개까지여야 한다.
- 세번째 인자인 dlim을 지정해주지 않으면 자동으로 '\n' 로 인식한다.
- dlim을 지정해주면 지정해준 문자 직전까지 입력값을 읽어 str에 저장한다.
system 함수
- system("cls")
- system 함수는 괄호 안에 있는 문자열을 명령 프롬프트에 직접 입력하는 효과를 준다.
- cls는 clean screen의 약자로, 현재까지 출력된 콘솔 화면을 모두 지워버릴 때 사용되는 함수이다.
- system("pause")
- pause라는 단어의 뜻에서도 알 수 있듯이, 프로그램을 일시정지 시키는 데 사용되는 함수입니다.
cin.ignore의 경우 C언어의 scanf 문자열 입력시 발생하는 버퍼문제와 비슷한 문제를 처리하기 위한 기능을 하는 것으로 보입니다.
- 참고 링크 : 씹어먹는 C 언어 - <15 - 2. 일로와봐, 문자열(string) - 버퍼에 관한 이해> (modoocode.com)
system 함수의 경우 system 자체의 내부 동작 원리가 더 있는 것 같지만 현재 상태에서 제대로 이해가 어려워 추후 다시 한 번 정리하도록 하겠습니다.
'C,C++ > 정보정리' 카테고리의 다른 글
[C/C++] 가상함수 (0) | 2022.09.30 |
---|---|
[C/C++] 파일 입출력 함수 정리 (0) | 2022.09.27 |
[C/C++] _getch() 함수 (0) | 2022.09.23 |
[C/C++] enum, enum class 차이점 (0) | 2022.09.20 |
[C/C++] 메모리 관련 함수(memcpy, memmove, memcmp) (0) | 2022.09.06 |
댓글