별의 공부 블로그 🧑🏻‍💻
728x90
728x170

*scanf() 입력 버퍼 비우는 방법


scanf()를 사용하다 보면, 입력을 정상적으로 받지 못할 경우가 생기게 된다.
이러한 종류의 문제는 입력 버퍼(stdin Buffer)와 관련된 문제가 대부분이며, 이 문제를 해결하기 위해서는 입력 버퍼를 비워줘야 한다.
입력 버퍼를 비우는 방법을 이 글에 총정리 해보았다.


#pragma warning(disable: 4996)
#include <cstdio>

int main() {
    char ch;

    scanf("%c", &ch);
    printf("1, %c\n", ch);
    
    scanf("%c", &ch);
    printf("2, %c\n", ch);
    
    return 0;
}

a
1, a
2, 

ab
1, a
2, b
  • 무슨 일이 일어났는지 확인해 보기 위하여 다음과 같이 코드를 수정해서 프로그램을 실행

#pragma warning(disable: 4996)
#include <cstdio>

int main() {
    char ch;

    scanf("%c", &ch);
    printf("1, %c\n", ch);
    
    scanf("%c", &ch);
    printf("2, %d\n", ch);   // %c -> %d로 형식 지정자 변경
    
    return 0;
}

a
1, a
2, 10

  • 정수 10을 아스키 코드표에서 찾아보면 \n임을 알 수 있음.
    • 엔터(Enter) 값이 버퍼에 들어가게 됨.
  • 이러한 문제를 해결하기 위해 다음과 같은 방법을 사용함.
    •  fflush(stdin) 사용

      • 표준으로 정의되어 있지 않음.
      • 플랫폼 마다 동작이 다를 수 있음.
      • 가급적 이 방법을 사용하지 않는 것이 좋음.
      #pragma warning(disable: 4996)
      #include <cstdio>
      
      int main() {
          char ch;
      
          scanf("%c", &ch);
          printf("1, %c\n", ch);
          
          fflush(stdin);  // 입력 버퍼의 내용을 비움.
      
          scanf("%c", &ch);
          printf("2, %c\n", ch);  
          
          return 0;
      }
      
      a
      1, a
      2,  
      
    •  getchar() 사용

      #pragma warning(disable: 4996)
      #include <cstdio>
      
      int main() {
          char ch;
      
          scanf("%c", &ch);
          printf("1, %c\n", ch);
          
          getchar();  // 입력 버퍼의 내용을 비움. 엔터(Enter)의 아스키 코드 값 10이 삭제됨.
      
          scanf("%c", &ch);
          printf("2, %c\n", ch);  
          
          return 0;
      }
      
      a
      1, a
      10
      b
      2, b
      
      • 하지만 다음과 같이 입력하면 제대로 작동하지 않음.
        • getchar() b를 가져와 b는 삭제되고, 엔터의 아스키 코드(10)가 다음에 입력됨.
      ab
      1, a
      2, 
      
      • 이 문제는 반복문 을 사용하여 해결할 수 있음.
      #pragma warning(disable: 4996)
      #include <cstdio>
      
      int main() {
          char ch;
      
          scanf("%c", &ch);
          printf("1, %c\n", ch);
          
          while (getchar() != '\n');  // 개행 문자를 만나게 되면 반복 종료
      
          scanf("%c", &ch);
          printf("2, %c\n", ch);  
          
          return 0;
      }
      
      ab
      1, 1
      b
      2, b
      


728x90
그리드형(광고전용)
⚠️AdBlock이 감지되었습니다. 원할한 페이지 표시를 위해 AdBlock을 꺼주세요.⚠️
starrykss
starrykss
별의 공부 블로그 🧑🏻‍💻


📖 Contents 📖