728x90
728x90
SMALL
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관련 기능이 정상 작동하도록 해준다.
728x90
300x250
LIST
'C │ C++ │ C# > C++' 카테고리의 다른 글
C++ Chapter 6.2 : 배열과 반복문 (0) | 2023.08.27 |
---|---|
C++ Chapter 6.1 : 배열 기초 (0) | 2023.08.26 |
C++ Chapter 5.3 : 난수 만들기 (0) | 2023.08.23 |
C++ Chapter 5.2 : 반복문$($while, do-while, for$)$과 점프$($break, continue, goto$)$ (0) | 2023.08.22 |
C++ Chapter 5.1 : 조건 분기 (if문, switch-case문) (0) | 2023.08.22 |