본문 바로가기
문법관련/C

11-2. 버퍼를 이용하는 입력 함수

by print_soo 2024. 6. 25.

scanf 함수가 문자를 입력하는 과정

#include <stdio.h>

int main(){
    char ch;
    int i;

    for(i=0; i<3; i++){
        scanf("%c", &ch);
        printf("%c", ch);
    }

    return 0;    
}

//--예상결과--
//tiger(엔터)
//tiger
//tiger(엔터)
//tiger
//tiger(엔터)
//tiger

//--실제결과--
//tiger(엔터)
//tig

 

 

 

위처럼 나오는 이유?

→ scanf로 데이터를 입력하면 버퍼에 저장한 후 첫 번째 문자만 변수 ch에 저장한다. 또 다음 scanf 함수가 호출되면 두 번째 문자인 i를 변수ch에 저장하고 세 번째도 마찬가지로 g를 저장한다. 그후 저장된 변수를 출력한다.

버퍼란? 프로그램 실행 중에 운영체제가 자동으로 할당하는 메모리의 저장공간이다.

그렇다면 어떤 입력에도 전부 다 출력해주려면 어떻게 해야할까?

#include <stdio.h>

int main(){
    char ch;
    int i;

    scanf("%c", &ch);
    while(ch1!='\n'){
        printf("%c", ch);
        scanf("%c", &ch);
    }

    return 0;    
}

이렇게 불편하게 버퍼를 사용하는 이유는 뭘까?

  1. 데이터를 안정적으로 입력받을 수 있다.
    1. 키보드로 입력하면 우선 버퍼에 저장하여 프로그램이 다른 일을 수행하느라 입력을 즉시 받지 못해도 데이터가 사라지지 않는다.
  2. 입력장치와 독립적으로 사용할 수 있다.
    1. scanf함수는 키보드에 직접 연결되어 있지 않기 떄문에 입력장치가 바뀌더라도 함수를 수정하지 않고 사용할 수 있다.

 

scanf 함수가 숫자를 입력하는 과정

 

  1. 문자열로 버퍼에 저장
  2. 각 문자가 아스키 코드값을 2진수로 저장
  3. %d에 따라 변환

버퍼에 남아있는 값 모두 지우기

입력함수를 사용했을 때 버퍼에 남아있는 값들이 다음 작업에 영향을 미칠 수 있기 때문에 버퍼를 한번에 지우는 함수를 배우자.

fflush(stdin)

stdin이란?

→ 익명의 버퍼이름

'문법관련 > C' 카테고리의 다른 글

12.1 문자열과 포인터  (0) 2024.06.26
11.3 getchar(), putchar()  (0) 2024.06.26
11-1. 아스키코드  (0) 2024.06.25
10. 배열과 포인터  (0) 2024.06.24
9. 포인터  (0) 2024.06.18