SW/C

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

seungH 2025. 3. 30. 21:20

scanf 특징

  1. 화이트스페이스를 구분하여 작동한다.
scnaf("%d%d",&a, &b);

scanf("%d %d",&a,&b);
둘은 다른거다!!
중간에 화이트스페이스 개수만큼 허용하는 것이다.
  1. 버퍼

키보드에 입력하는 데이터는 일단 버퍼에 저장된 후 scanf함수에 의해 변수에 입력된다.

#include <stdio.h>
int main(){
    char ch;
    int i;

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

이 예제는 문자를 입력하고 화면에 출력하는 과정을 세번 반복한다.

그러나 실행 결과는 한 번의 키보드 입력으로 끝난다!!!

→최초 scanf 함수가 호출될 때 키보드로 문자열을 입력하면 일단 버퍼에 저장한다. 버퍼에 남아있는것들을 우선적으로 채워넣고, 버퍼에 없을 경우 새로 입력받는다.

따라서!!

입력데이터를 하나 입력하고 엔터를 입력하면 화이트스페이스도 버퍼에 저장이 된다.

#include <stdio.h>
int main(){
    char ch;
    while(1){
        scanf("%c",&ch);
        if(ch== '\\n') break;
        printf("%c", ch);
    }
    return 0;
}
이런식으로 입력받은값을 출력하는 코드를 짤수도 있다!

scanf의 반환값

scanf는 -1을 반환하기 전까지 모든 데이터를 사용할 수 있다.

입력버퍼 지우기

따라서 %d로 입력을 여러번 받을 경우에 getchar()를 사용해서 버퍼를 지워줘야 한다.

상황 버퍼 문제 해결 방법

scanf("%d") 후 scanf("%c") 사용 개행(\\n)이 남음 getchar(); 사용
scanf("%d") 후 fgets() 사용 개행(\\n)이 남음 getchar(); 사용
연속된 scanf("%c") 사용 이전 입력의 개행(\\n)이 다음 입력에 영향을 줌 getchar(); 사용
scanf() 입력 오류 발생 잘못된 입력이 버퍼에 남음 while (getchar() != '\\n'); 사용

'SW > C' 카테고리의 다른 글

13-2 함수의 데이터 공유 방법  (0) 2025.03.30
12-1 문자열과 포인터  (0) 2025.03.30
10-1 배열과 포인터  (0) 2025.03.30
9-2 포인터 완전정복  (0) 2025.03.30
9-1 포인터  (0) 2025.03.30