본문 바로가기
카테고리 없음

[C++] double 변수의 cin.get() 함수 응용

by Hmile 2023. 3. 30.
반응형

 

질문.

#include <iostream>
#define _CRT_SECURE_WARNINGS

using namespace std;

int main() {

    char c;
    double val;

    while ((c = cin.get()) != '\n') {
        if ((c >= '0' && c <= '9')) {
            cin.unget();
            cin >> val;
            printf("%.2f ", val);
        }
    }
}

입력값을 0.35a0.45 0.55 로입력하면 출력값으로 0.35 0.45 0.55 가 나옵니다 

근데 0.35를 전체를 문자로 인식하는 부분이 이해가 안가서 이에 대한 이유와 동작과정을 알고싶습니다...

 

반응형

 

답변.

우선, 우리가 cin으로 입력을 받을떄는 키보드로 받은 입력을 cin 버퍼에 저장하고 있다가, 

프로그램에서 지정한 변수들(메모리 공간)에 하나씩 집에 넣게 됩니다. 

 

0.35를 하나의 문자로 인식할 수있는 이유는 

단도직입적으로 말씀드리면, val이 double로 선언 되어 있기때문이에요!~

 

코드에서 c는 char 이기떄문에 한문자씩 입력 받는거고, 

그래서 처음에 if문에 들어갈 수 있는 이유는 0.35a ... ...  라는 입력에서 맨 처음 0만 c에 들어가서, 

c가 0이기 때문에if문 안에 들어가는거구요!~

 

cin 버퍼에서는 현재 0.35a.. 가 입력으로 들어가야 하는데, 현재 맨앞에 0만 c에 들어갔기 때문에, 

.35a... 들이 프로그램 내부로 입력 되어야 할 차례입니다. 

 

하지만 다음 라인의 cin.unget();은 마지막에 읽은 정보를 다시 cin 버퍼에 넣기때문에 

0은 cin 버퍼에 그대로 남아있게 됩니다. 

따라서 cin >> val을 해주게 되면, 

cin 버퍼에 남아있던  0.35a..가 val에 들어가게 되는것이구요, 

 

하지만 여기서 val은 double 형이기때문에,

0.35a0.45....의 입력 중, 0.35만 val에 들어가게 됩니다. 

(이부분이 매끄럽지 않으시다면 테스트 코드로, 

double a;

cin >> a;

cout << a;

이렇게 해보신후에 입력을 0.35a 로 입력해 보세요!~ 출력값이 0.35로 나올꺼에요!~)

 

그리고 cin 버퍼엔 0.35가 입력 되었기때문에, 이제 a0.45... 부분부터 프로그램에 넣어줄수 있는 상황이 되었구요,

printf를 통해 val 0.35를 출력후, 

와일문의 c = cin.get()) 을 수행 하게 되면 c는 한글자만 입력 가능 하니까, 이번엔 a0.45... 에서 a가 변수 c에 들어가게 됩니다. (이제 cin 버퍼에 남은것은 0.45 0.55\n)

그리고 조건절을 확인하니까... 변수 c는 a를 저장하고 있기때문에 (\n은 입력 버퍼의 가장 마지막 입력으로 들어와 있습니다. a0.45 0.55\n ) 

와일문의 조건절을 만족해서( c = cin.get()) != '\n') 와일문 안으로 들어옵니다. 

 

와일문에 들어가서 if문 조건을 보니 c는 0~9사이의 아스키 코드가 아니기때문에, if문안에 못들어가고, 

다음 반복문을 실행하기 위해 와일문으로 들어가게 됩니다. 

 

와일문의 c = cin.get()) 을 수행하면서  cin 버퍼에 남은  0.45 0.55\n 중에 맨앞에 0이 c에 들어가게 되고... 

if문안에 들어와서 unget()을 수행 하면 cin 버퍼엔 여전히 0.45 0.55\n이 남게 되어

cin >> val을 하면 0.45가 통째로 들어가게 됩니다.  (실수형의 숫자 0.45)

 

그리고 다음와일문에서 c는 공백 문자가 들어가게 되고 이는 if문의 조건절을 만족하지 못하기때문에

다시 다음 와일문을 수행 하려 합니다.

그리고 다시  0.55\n 중에 맨앞에 0이 c에 들어가고

이런식으로 코드는 동작하게 됩니다. 

 

while ((c = cin.get()) != '\n') {

    cout<<"if문 밖"<<c<<endl;

        if ((c >= '0' && c <= '9')) {

            cin.unget();

            cin >> val;

            printf("%.2f ", val);

        }

}

 

위의 코드처럼 한줄을 더 삽입하여 실행 보시면 아마 코드를 좀더 잘 이해 하실수 있을꺼에요!

728x90
그리드형(광고전용)