버퍼는 데이터를 보관하는 역할을 하므로 최초 입력할 때 필요한 데이터를 한꺼번에 저장해 놓으면 scanf 함수는 호출 즉시 버퍼에서 데이터를 가져올 수 있다.
#include <stdio.h>
int main(void)
{
char ch;
int i;
for ( i = 0; i < 3; i++) // 3번 반복
{
scanf("%c", &ch); // 문자 입력
printf("%c, ch"); // 입력된 문자 출력
}
return 0;
}
첫째, 데이터를 안정적으로 입력받을 수 있다.
둘째, 입력장치와 독립적으로 사용할 수 있다.
#include <stdio.h>
int main(void)
{
int res; // scanf 함수의 반환값을 저장할 변수
char ch; // 문자를 입력할 변수
while (1)
{
res = scanf("%c", &ch); // 문자 입력, <Crtl> + <Z>를 누르면 -1 반환
if (res == -1) break; // 반환값이 -1이면 반복 종료
printf("%d", ch); // 입력된 문자의 아스키코드 값 출력
}
return 0;
}
getchar 함수도 버퍼를 사용하는 문자 입력 함수이다.
getchar 함수를 반복 사용하면 한 줄의 문자열을 char배열에 입력할 수 있다.
#include <stdio.h>
void my_gets(char *str, int size);
int main(void)
{
char str[7]; // 문자열을 저장할 배열
my_gets(str, sizeof(str)); // 한 줄의 문자열을 입력하는 함수
printf("입력한 문자열 : %s\n", str); // 입력한 문자열 출력
return 0;
}
void my_gets(char *str, int size) // str은 char 배열, size는 배열의 크기
{
int ch; // getchar 함수의 반환값을 저장할 변수
int i = 0; // str 배열의 첨자
ch = getchar(); // 첫 번째 문자 입력
while ((ch != '\n') && (i < size -1)) // 배열의 크기만큼 입력
{
str[i] = ch; // 입력한 문자를 배열에 저장
i++; // 첨자 증가
ch = getchar(); // 새로운 문자 입력
}
str[i] = '\0'; // 입력된 문자열의 끝에 널 문자를 저장
}
scanf와 getchar 함수는 같은 버퍼를 사용하며 입력 데이터를 공유한다.
따라서 앞서 실행한 입력함수가 버퍼에 남겨둔 데이터를 그 이후에 수행되는 함수가 잘못 가져갈 가능성이 있다
따라서 버퍼에 남아 있는 불필요한 데이터는 미리 제거하는 것이 좋다.
→ 버퍼에 남아있는 문자들을 모두 입력해서 사용하지 않고 버리면 된다.
#include <stdio.h>
int main(void)
{
int num, grade; // 학번과 학점을 저장할 변수
printf("학번 입력 : ");
scanf("%d", &num); // 학번 입력
getchar(); // 버퍼에 남아 있는 개행 문자 제거
printf("학점 입력 : ");
grade = getchar(); // 학점 입력
printf("힉반 : %d, 학점 : %c", num, grade);
return 0;
}
scanf 함수가 데이터를 입력할 때는 가장 먼저 버퍼의 상태를 확인한다.
버퍼에 저장되는 데이터의 끝에는 항상 개행 문자가 있다.
scanf 함수는 Crtl + Z를 누르면 EOF(-1)을 반환한다.