본문 바로가기
C │ C++ │ C#/C++

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

by Pokaa 2023. 8. 25.
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