본문 바로가기
메모.

C언어 문자 입력 받을 시 주의사항 #문자 인식 못함, 문자 오류

by 낭람._. 2022. 7. 30.
반응형

getchar, scanf("%c")는 흔히 문자를 입력 받을 때 사용한다.

 

하지만, 처음 사용하는 경우 getchar, scanf("%c")가 정확히 '무엇을 받아오는지' 모르기 때문에 오류가 생기기도 한다.

 

아래는 흔하게 오류를 발생하는 코드다.

#include<stdio.h>
int main() {
    char a, b;
    a = getchar();
    b = getchar();
    printf("%c %c", a, b);
    return 0;
}
입력 > a
출력 > a

실행을 하고 a에 입력을 하면 바로 printf가 실행되며 종료된다.

 

scanf("%c")도 위와 같이 a 입력 후 printf가 실행된다.

#include<stdio.h>
int main() {
    char a, b;
    scanf("%c", &a);
    scanf("%c", &b);
    printf("%c %c", a, b);
    return 0;
}

 

입력 > a
출력 > a

 

이유를 알기 위해서는 getchar와 scanf("%c")가 '무엇을 받아오는지' 알아야 한다.

 

컴퓨터에는 버퍼(Buffer)라는 놈이 존재한다.

 

버퍼란 잠깐 사용하는 임시 저장 공간이라고 생각하면 된다.

 

유튜브 화면에서 버퍼를 쉽게 확인할 수 있는데, 영상을 재생하기 위해 임시로 저장하고 있는 회색 공간이 버퍼다.

 

그럼 이 버퍼가 왜 우리의 코드를 방해하는 걸까?

 

getchar(), scanf("%c")

위의 두 함수를 사용하기 위해서는 우리는 단어를 입력하고 엔터를 누른다.

 

단어를 입력하고 엔터를 누르면, 버퍼에는 단어 + 엔터가 들어가게 된다.

 

 

그림으로 보면 저렇게 'a' 와 엔터를 의미하는 \n가 같이 들어 가 있다.

 

getchar(), scanf("%c")

이 두 함수는 버퍼에서 가장 처음에 있는 데이터를 가져온다.

 

당연히 Buffer에는 \n만 남게 된다.

#include<stdio.h>
int main() {
    char a, b;
    a = getchar(); // a를 입력한다.
    b = getchar(); // Buffer의 '\n'를 받아온다.
    printf("%c %c", a, b); // printf("a \n"); 이 출력된다.
    return 0;
}

 

다시 코드를 보면, a가 Buffer에서 'a'를 꺼냈기 때문에 Buffer에는 '\n'가  남아있는 상태가 되고, b = getchar()를 하면, '\n'이 b로 들어가게 되는 것이다.

 

따라서, getchar로 문자를 받고 빈 getchar를 쓴다면 '\n'이 빈 getchar로 들어가게된다. 

#include<stdio.h>
int main() {
    char a, b;
    a = getchar();
    getchar();
    b = getchar();
    getchar();
    printf("%c %c", a, b);
    return 0;
}
입력 > a
입력 > b
출력 > a b

 

sacnf("%c")를 사용할 때도 똑같이 getchar를 중간에 넣어주면 해결 된다.

#include<stdio.h>
int main() {
    char a, b;
    scanf("%c", &a);
    getchar();
    scanf("%c", &b);
    getchar();
    printf("%c %c", a, b);
    return 0;
}
입력 > a
입력 > b
출력 > a b
반응형

댓글