Programming Language/C

[C] 표준 입력함수

lingk 2018. 8. 21. 01:32

표준 입력함수에는 scanf(), getchar(), getch(), gets_s() 이 있다. 각 함수들의 특징을 살펴보자.

 

1. scanf()

 

scanf()함수를 통해 입력을 받으면 입력값은 stdin(입력스트림)에 일시적으로 저장 되었다가, 입력을 마치면 한꺼번에 처리한다. 컴퓨터는 엔터키, 즉 '\n'을 통해서 종료를 알아차린다. 하지만 공교롭게도 컴퓨터는 '\n'또한 입력 버퍼에 저장을 한다. 따라서 scanf()함수를 사용할때 '\n'을 고려해야 하는데, 예시를 통해서 상황을 살펴보자.

 

다음과 같은 코드가 있다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>



   int main(void)
   {
    int num;
    char a;
    printf("숫자 입력:");
    scanf("%d", &num);
    printf("문자 입력:");
    scanf("%c", &a);
    return 0;
   }

실행 결과는 다음과 같다.

 

 

 

 

작성한 코드에 따르면 숫자를 입력받고 문자를 입력받아야 한다. 1을 입력하고 숫자 입력을 종료하기 위해서 엔터키를 누르게 된다. 이 때 입력버퍼에는 '1\n'이 저장되는데, %d를 통해 숫자 데이터를 입력받으므로 숫자 1을 처리하고 입력버퍼에는 '\n'이 남게된다. 문자를 입력 받아야하지만 입력버퍼안에는 공백문자'\n'이 남아 있으므로 &a에는 '\n'이 자동으로 저장되고 문자는 입력받지 않고 넘어간다.

따라서 &a에 저장 된 값을 출력해 보기 위해 printf("%c출력",a); 코드를 추가하여 실행해 보면 다음과 같이 출력이 한 칸 개행되어 나타난다.

 

 

 

 

scanf()함수에서 %d는 숫자, %c는 문자, %s는 문자열이 실질적인 데이터 값이다. 입력버퍼에서 실질적인 데이터가 나오기 전 까지 남아있는 공백문자('\n', ' ', '\t)들은 모두 무시하게 된다. 따라서 %d, %s와 같은 데이터를 사용할 때는 '\n'을 고려하지 않아도 되지만,  %c 문자 데이터를 사용할 때는 위와 같은 상황을 고려하여 사용해야한다.

 

 

 

2. getchar()

 

    • 하나의 문자를 받아서 반환하고, 입력버퍼(stdin)를 사용하는 함수이다. 
    • scanf()함수와 같이 엔터키(\n)을 통해서 입력 종료를 알리고, 버퍼에 '\n'을 저장한다.

 

getchar()함수의 실행 예시를 살펴보자.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

   int main(void)
   {
    char num;
    num=getchar();
    printf("%c", num);
    return 0;
   }  

 

getchar()함수는 단일문자를 입력받는 함수이므로 숫자를 입력받더라도 %c로 데이터를 받아야한다. 

getchar()함수는 숫자를 입력받을 때 두자리 이상의 숫자는 입력받지 못한다는 단점이 있다. 

 

다음은 두자리수인 '12'를 입력받고 출력해본 결과이다.

 

 

 

getchar()함수는 scanf()함수에서 문자를 입력받을 때 발생하는 문제를 해결하기위하여 사용하기도 한다.

scanf()함수에서 실행한 코드를 다음과 같이 추가하여 실행해 보았다.

 

 #define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

   int main(void)
   {
    int num;
    char a;
    printf("숫자 입력:");
    scanf("%d", &num);
    getchar();
    printf("문자 입력:");
    scanf("%c", &a);
    return 0;
   }​

 

 

 

추가한 getchar()함수가 '\n'을 받아 입력버퍼에는 아무것도 남지 않게 된다. 따라서 &a에 문자'a'를 저장할 수 있게 되었다. 

 

3. getch()

  • 입력버퍼를 사용하지 않으며, 단일 문자를 입력받기 때문에 한 문자를 입력하자마자 종료된다. 
  • 사용방법은 getchar()과 비슷하다.
  • 입력문자가 보이지 않는다.(보안용)
 
getch()함수는 다음 예시와 같이 메뉴에서 자주 쓰인다.
 #define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

   int main(void)
   {
    char ans;
    printf("게임을 계속 하시겠습니까?(Y/N)");
    ans = getch();
    if (ans == 'Y')
     printf("\n게임을 계속하겠습니다\n");
    else
     printf("\n게임을 종료하겠습니다\n");
    return 0;
   }

 

 

 

4. gets_s()

 

  • 문자열 단위로 입력받는 함수이다.
  • '\n'은 문자열에 포함되지 않는다.
  • '\0'(널문자)은 자동으로 맨 마지막에 추가된다.

scanf(%s, &word)와의 차이점

 

%s는 하나의 단어만을 입력받는다. 줄 단위로 입력받을 때 gets_s()를 사용하여야 한다.

실행 예를 통해 살펴보자.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
   {
    char word[12];
    char words[12];
    printf("문자를 입력하시오:");
    scanf("%s", &word);
    printf("scanf함수:%s\n", word);
    while(getchar()!='\n');
    printf("문자를 입력하시오:");
    gets_s(words, sizeof(words));
    printf("gets_s함수:%s\n",words);
 
    return 0;
   }

 

 

"hello world"를 scanf()함수를 통해서 입력받았을 때는 "hello"한 단어만 저장된다. 따라서 한 줄 전체를 저장하기위해서는 gets_s()함수를 사용해야한다.

 

위 예시와 같이 gets_s()함수는 gets_s(문자배열, 최대문자개수)형식으로 사용하면 된다.

반응형

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

[C] strcmp()  (0) 2020.11.26
[C] 16진수 표현  (0) 2020.11.25
[C] strcpy() strncpy()  (0) 2020.11.24
[C] write() 함수  (0) 2020.11.20
[C] 포인터 연산  (0) 2020.11.05