ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C언어] 입력버퍼
    C \ C++ 2021. 1. 1. 21:31

    코드 작성중 3번째 scanf를 받지 못하고 지나가는 일이 발생했다.

    찾아보니..

        scanf("%s", name);
        scanf("%d"&age); 
        scanf("%c"&c);
        scanf("%lf"&b);
    cs

    두번째 scanf에서 정수를 받고 엔터를 누르면 버퍼에 ₩n(엔터) 에 대한 버퍼가 남아 있어서 그렇다고 한다

     

    그전에 잠시 버퍼에 대해 간단히 알아보자

     


     

    버퍼(buffer)란?

     

    우리가 흔히 사용하는 printf(), scanf(), puts() 함수 등은 c언어의 표준 입출력 함수이며,

    이러한 표준 입출력 함수를 사용할 때에는 버퍼(buffer)라는 임시 메모리 공간을 사용하게 된다.

    키보드를 통해 입력되는 데이터는 일단 입력버퍼에 저장된 후 프로그램에서 읽혀진다.

    우리가 데이터를 입력하고 엔터를 누른 시점에서 입력 스트림을 거쳐 입력버퍼로 들어간다 

    이미지 출처: http://www.tcpschool.com/c/c_io_console

     

     


     

    정수형 데이터의 경우 '\n'이 버퍼에 있어도 정수형이 아니기 때문에 무시하고

    '%s'는 버퍼에서 값을 받으면서 유효한 데이터가 나올때 부터 저장하여 문자를 읽어오다가 '\n'이 나오면

    '\0(null)'을  저장하면서 끝내지만 

     

    '%c'를 받는 경우 \n을 받아 버리는 행위가 필요하다.

     

    문제를 해결 하기 위해선

     

    -getchar()를 통하여 해결

     

    scanf("%d", &age);

    getchar();

    scanf("%c", &c);

     

    를 통하여 ₩n 을 받고 버퍼를 비울 수 있다.

     

    -%c 앞에 공백

     

    scanf(" %c", &c)를 사용하여 앞에 스페이스를 넣으면 ₩n 을 white space로 받아 넘길수 있다.

     

    -%*c 를 추가

     

    scanf("%*c%c", &c) 를 사용하여 첫 번째 %*c에서 버퍼를 받지만 버리고 , 

    다음 %c 를 통해 데이터를 받을 수 있다.

     

     

     

     

     

    728x90
    반응형

    'C \ C++' 카테고리의 다른 글

    [c++ error] warning: range-based for loop is a C++11 extension  (0) 2021.01.19
    [C++] range-based for statement  (0) 2021.01.19
    [C++]ERRORS  (0) 2021.01.17
    [C] 출력과 입력(printf, scanf , scanf_s)  (1) 2020.11.02
    [C] 자료형 (Data Type)  (1) 2020.11.02

    댓글

Designed by Tistory.