일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 큐
- RT scheduling
- 연결리스트
- 프론트엔드
- 해시테이블
- 코딩테스트
- cors
- 컨테이너
- Machine Learning
- 알고리즘
- alexnet
- C
- RxJS
- vue3
- 자료구조
- 릿코드
- 웹팩
- 스택
- 배열
- 이진탐색
- GraphQL
- pytorch
- 타입스크립트
- 포인터
- 브라우저
- 프로세스
- APOLLO
- 프로그래머스
- 자바스크립트
- 연결 리스트
- Today
- Total
프린세스 다이어리
[C] C언어에서 문자를 처리하는 방법, 문자와 버퍼의 관계 본문
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
정수형 데이터 입력 후, 문자형 데이터 입력까지 잘 된다.
'C, C++' 카테고리의 다른 글
[C] 컴퓨터가 변수를 처리하는 방식에 대하여 정리 (0) | 2021.09.29 |
---|---|
[C] C언어에서 문자열을 다루는 방법, 문자열 관련 함수 정리 (0) | 2021.09.28 |
[C] 포인터 개념, 활용방법 정리 (0) | 2021.09.26 |
[C] 배열 선언방법, 문자열 정리 (0) | 2021.09.25 |
[C] 함수 문법 정리 (0) | 2021.09.25 |