Learn And Earn

scanf, gets, getc함수 본문

컴퓨터/코딩

scanf, gets, getc함수

Determined 2020. 10. 3. 01:42
반응형

이번 포스팅에서는 C언어의 입력값을 받아들이는 입력함수들에 대해서 알아보도록 하겠습니다.
이 입력함수에 대해서 보다 더 잘 이해하기 위해서는 입력 버퍼의 개념을 알아야 합니다.
따라서 입력버퍼에 대해서 알아본 다음, 이를 기반으로 getc, gets, scanf, scanf_s함수들의 사용법에 대해서 알아보겠습니다. 그 다음, 이러한 입력함수를 사용할 때 주의할 점에 대해서 간략히 짚고 넘어가겠습니다.


입력버퍼란?

입력버퍼란, 표준 입력 함수로부터 전달받은 입력값을 저장하는 임시적인 메모리 공간을 뜻합니다.
이와 같이 임시로 보관되는 입력값은 특정한 입력값을 받기 전까지 계속해서 입력값을 받아들이는 것으로 인식합니다.
여기서 말하는 특별한 값으로는 엔터키와 같은 escape값들이 되겠습니다.

 

우리가 메세지를 보낼 때, 검색을 할 때, 우리는 어떠한 값을 입력합니다. 그리고 입력을 마쳤을 경우, 입력란은 공백과 같이 초기화가 됩니다. 우리는 이와 같이 입력란이 자동으로 초기화되는 것이 편하고 익숙하다는 것을 경험적으로 알고 있습니다.

 

하지만 입력버퍼는 스스로 초기화하지 않습니다. 그렇기 때문에, 초기화를 따로 지정을 해주지 않고
만약 입력버퍼에 남아있는 데이터가 있을 경우, 그 이후에 입력값을 전달해도 기존에 있는 입력값과 함께 전달이 되어 의도와 전혀 다른 입력값을 전달하게 되는 경우가 있습니다.  


getc 함수

getc함수는 파일 구조체형 포인터인 stdin을 인수로 하여, 그 입력받은 값을 문자상수의 형태로
반환하는 입력함수입니다.

#include <stdio.h>
int getc(FILE* stream);
int main(void) {
  char p = getc(stdin);
  printf("%c",p);
  return 0;
}
>>>
asd
a

실행을 하여 asd를 입력할 때, 가장 앞에 위치한 a만을 출력하는 것을 볼 수 있습니다. 이는 입력버퍼의 특징에의해 나타나는 현상입니다.

 

gets함수

gets함수는 입력버퍼에 대응하는 문자상수를 저장하는 메모리 공간을 전달받아, 그 메모리공간에 전달된 입력값을 문자열의 형태로 반환하는 함수입니다.

#include <stdio.h>
char *gets(char *buffer);
int main(void) {
  char input[20];
  gets(input);
  printf(input);
}
>>>
asd asd 
asd asd

scanf 함수

scanf함수는 앞의 함수들과는 격이 다릅니다. 즉, 입력받을 수 있는 값이 문자상수, 문자열로 한정되어있지 않습니다.

대신에 scanf함수는 형식을 지정하는 키워드를 통해서 원하는 형식으로 값을 입력받을 수 있습니다.

 

scanf 함수를 사용할 때 지정하는 형식은 printf 함수와 거의 동일합니다. 

printf 함수는 그 키워드가 지정하는 형식과, 그에 대응하는 변수 및 상수의 type이 서로 달라도 어떻게든 출력됐습니다. 하지만 scanf함수는 포인터 문법을 사용하여 구현한 함수이기 때문에, 그 자료형이 서로 다를경우, 프로그램의 작동에 문제가 생기게 됩니다.

 

#include <stdio.h>

int main(void) {
  char name[32];
  int score;
  float height;
  printf("Name, Algorithm_score, Height\n");
  scanf("%s %d %f",name,&score,&height );
  printf("%s %d %f",name,score,height);
  return 0;
}
>>>
Name, Algorithm_score, Height
Jim 44 188
Jim 44 188

 


이번 포스팅에서는 저와함께 입력버퍼의 개념과 C의 입력함수인 getc, gets, scanf함수에 대해서 알아보았습니다.

 

다음 포스팅에서 더 유익한 정보로 돌아오겠습니다. 감사합니다.

반응형
Comments