C++ Chapter 5.4 : std::cin 더 잘쓰기
카테고리: Cpp
태그: Cpp Programming
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!
std::cin
- cin은 공백 단위로 구분하여 사용자로부터 입력을 받는다.
- 입력받은 것을 버퍼에 넣은 후 하나씩 꺼내는 방식으로 실행된다.
#include <iostream>
using namespace std;
int getInt()
{
cout << "Enter a integer number : ";
int x;
cin >> x;
return x;
}
char getOperator()
{
cout << "Enter an operator (+,-) : ";
char op;
cin >> op;
return op;
}
void printResult(int x, char op, int y)
{
if (op == '+') cout << x + y << endl;
else if (op == '-') cout << x - y << endl;
else
{
cout << "Invalid operator" << endl;
}
}
int main()
{
int x = getInt(); // "100 100" 입력한다고 가정
char op = getOperator(); // "+" 입력한다고 가정
int y = getInt();
printResult(x, op, y);
return 0;
}
int x = getInt();
부분에서 콘솔창에 "100 100"을 입력한다고 가정해보자. 오버해서 입력한 셈.- 버퍼에
100 100 \n
이 들어간다.- 공백으로 구분하여 ‘100’ 2개, 그리고 엔터친 \n 까지 들어가 있는 모양
- int x 에 100이 대입되며 100 하나가 빠져나온다.
- 버퍼의 상태는
100 \n
이 된다.- 이 상태에서
char op = getOperator();
char 타입의 문자를 받아버리면 사용자는 ‘+’를 입력했다 하더라도 버퍼에 남아있던100
이 더 우선시 되어 100이 op의 값으로 대입되어 버린다. - char에 정수를 받을 수 있기 때문. (아스키 코드)
- 따라서 제대로 된 연산자가 op에 들어가지 않아
printResult(x, op, y);
에서 “Invalid operator”를 출력하고 끝난다.
- 이 상태에서
- 버퍼의 상태는
- 버퍼에
- 버퍼를 비워주는 과정이 중간에 들어갔다면 ‘+’가 op에 제대로 대입이 됐을 것이다.
std::cin.ignore
int getInt()
{
cout << :"Enter an integer number : ";
int x;
cin >> x;
std::cin.ignore(32767, '\n'); //32767 is a suitable big number
return x;
}
std::cin.ignore(무시 문자 최대길이, 종료 문자);
- std::cin.ignore(32767, ‘\n’);
- 입력버퍼에서32767 길이의 문자를 무시하고 비운다. ‘\n’이 나올 때 까지.
std::cin.fail(), std::cin.clear()
int getInt()
{
cout << :"Enter an integer number : ";
int x;
cin >> x;
if (std::cin.fail()) // 입력실패시
{
std::cin.clear(); // 플래그값 초기화
std::cin.ignore(32767, '\n'); // 버퍼 비워주기 (버퍼 무시)
cout << "Invaild number, please try again" << endl;
}
else
{
std::cin.ignore(32767, '\n');
return x;
}
}
std::cin.fail()
: cin 오류시, 즉 입력 실패시 true 리턴, 오류 없으면 false 리턴.
std::cin.clear()
: cin의 내부 상태의 플래그 값을 초기화 시켜 cin관련 기능이 정상 작동하도록 해준다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글남기기