진짜 개발자
본문 바로가기

Language/C

C - 4. 입력(scanf)

728x90

1. scanf() - 이 함수는 사용자의 입력을 위해 사용된다.
                -  1. 제어문자열 인자와 2. 변수의 주소값을 받는다
                       *제어문자열 - 입력스트림에서 어떻게 문자를 해석할 것인가를 명시
                
            * 사용법 -  scanf("%d" , &a);   => 변수 a에 정수 값을 입력 

 2. scanf  정수입력 문자입력시 문제

    - scanf를 통해 정수를 입력받고 다시 scanf로 문자를 받으려하면 입력하기도전에 실행이 끝나게
       되는 경우가 있다
              
    *원인 - 무언가 입력한 자료를 컴퓨터가 처리를 할 때에  한글자  한글자 입력이 될 때마다 
                처리하는 식으로 한다면
               굉장히 비효율 적이다 그래서 컴퓨터는 stdin 이라는 메모리버퍼에 자료들을 저장했다가 
                특정 값이오면 (예: ' ' , \t , \n )  처리를 한다
              (예를들면 약수터에서 물을 받아오려고 할 때 손으로 물을 집까지 반복하여 나르지 않고                       물통을 이용하여 물을 퍼오는 것과 같다)
               따라서 사용자가 정수 입력을 하더라도 stdin이라는 메모리 버퍼에는 사용자가 입력한 숫자와
               엔터("\n") 즉, 개행문자가 저장이된다 이때 다시 사용자가 문자 입력을 받기 위해 
              scanf("%c",&변수);를 사용한다면 메모리버퍼에 저장되어있던 "\n" 문자가 변수에 담기게
              되어 사용자의 입력을 받기도 전에 실행이 끝나게 된다.

    *해결 -  1. fflush() 메소드를 이용하여 메모리 버퍼를 비운다
                 2. getChar() 를 이용하여 메모리 버퍼에서 한글자를 리턴시킨다 
                     (한글자를 버퍼에서 삭제하는 느낌)


   * 소스
 #include <stdio.h>

void main() {

    int a;
    char c;

    printf("정수 입력 : \n");
    scanf_s("%d", &a , sizeof(a));

    getchar();   <= 메모리에 남아있던 \n를 받아와서 리턴시킴

    printf("문자 입력 : \n");
    scanf_s("%c", &c , sizeof(c));

    printf("정수 = %d\n" , a);
    printf("문자 = %c\n", c);
    
}



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

C - 5. 조건문  (0) 2018.09.05
C - 4.1 scanf와 scanf_s  (0) 2018.09.05
C - 3. 출력(printf)  (0) 2018.08.15
C - 2. 상수  (0) 2018.08.15
C - 1. 변수  (0) 2018.08.15