프린세스 다이어리

[C] C언어에서 문자를 처리하는 방법, 문자와 버퍼의 관계 본문

C, C++

[C] C언어에서 문자를 처리하는 방법, 문자와 버퍼의 관계

개발공주 2021. 9. 27. 12:00
728x90

1. 아스키코드

 

C에서 문자는 아스키코드를 따른다. 아스키코드는 0~127 중에 1바이트로 구성되며, 주요 문자를 출력하도록 해 준다.

0 ~ 9 48 ~ 57
A ~ Z 65 ~ 90
a ~ z 97 ~ 122
#include <stdio.h>

int main(void) {  
    char a = 65;
    printf("%c\n", a);
}

이렇게 아스키코드로 65에 해당하는 하나의 문자를 바로 출력하도록 할 수도 있다. 문자 입출력에서 형식 지정자로 %c를 사용한다. 컴퓨터는 결국 내부적으로 숫자로 처리하고 있다는 것이다. 모든 문자열은 내부적으로 숫자로 표현되기 때문에 int형을 사용하여 문자를 입력받을 수 있다.

 

2. 버퍼가 무엇인가

 

사용자로부터 1개의 문자를 입력받을 때는 get character 라는 의미로 getchar() 함수를 호출하면 된다. 

#include <stdio.h>

int main(void) {  
    char a = getchar();
    printf("%c\n", a);
}

문자열을 처리할 때는 버퍼(buffer)를 이용해 입출력 데이터를 처리한다. 버퍼란 임시적으로 특정한 데이터를 저장하기 위한 목적으로 사용되는 개념이다. 사용자가 큰 문자열을 넣었을 때, 컴퓨터가 한꺼번에 처리하기 힘드니 내부적으로 버퍼에 임시로 데이터를 담아서 천천히 한 개씩 처리를 하는 것이다. 컴퓨터의 연산 속도는 빠르지만, 처리할 수 있는 양은 한정적이기 때문이다. 

 

다음은 입력 버퍼로 인해 흔히 발생하는 오류다.

#include <stdio.h>

int main(void) {  
    int a;
    char c;
    scanf("%d", &a);
    printf("%d\n", a);
    scanf("%c", &c);
    printf("%c\n", c);
}

정수형 데이터를 입력받고 출력 후, 문자형 데이터를 입력받고 출력하는 로직을 짰다. 그런데 이 코드를 실행시켜 보면 문자형 데이터를 입력 후 바로 프로그램이 종료되어 버린다.

3
3


➜  cstudy

그 이유는 줄바꿈과 공백도 아스키코드로 처리하고 있는데, 처음 문자열을 입력하고 엔터를 치면 그 줄바꿈 자체를 문자열로 인식을 해서 프로그램을 종료하기 때문이다. 입력 버퍼로 발생하는 흔한 오류다.

 

이를 해결하기 위해 남아 있는 입력 버퍼를 지우는 방식이 가장 대표적이다.

#include <stdio.h>

int main(void) {  
    int a;
    char c;
    scanf("%d", &a);
    printf("%d\n", a);
    
    int temp;
    while ((temp = getchar()) != EOF && temp != '\n') {}
    
    scanf("%c", &c);
    printf("%c\n", c);    
}

getchar() 함수를 통해 입력받은 문자가 EOF(end of file, 파일의 끝)이거나 줄바꿈 문자라면 아무것도 처리하지 않도록 한다. while문을 사용함으로써 남아 있는 개행 문자들을 다 없는 것처럼 처리하여 입력 버퍼를 비워주는 것이다. 

13
13
d
d

정수형 데이터 입력 후, 문자형 데이터 입력까지 잘 된다. 

 

 

728x90
Comments