C++ Chapter 5.4 : std::cin 더 잘쓰기

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 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관련 기능이 정상 작동하도록 해준다.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기