공부/C 언어

문자열 입력 함수 scanf, gets, fgets

1.Feel5 2020. 11. 22. 17:31
반응형

C언어 에서 문자열을 입력받는 함수에 대하여 알아보려고 한다.

그전에 문자가 어떻게 입력되는지 알아보자.

문자는 프로그램이 실행되면 키보드로 부터 데이터 입력을 위해 운영체제가 입력 버퍼를 생성한다.

입력 버퍼란? 데이터 입력을 위한 특정 크기의 메모리 공간이다.

 

키보드로 부터 enter를 입력 받으면 입력된 데이터가 한꺼번에 입력버퍼로 이동한다.

따라서 이렇게 입력된 것을 scanf(), gets(), fgets()함수는 입력버퍼에서 데이터를 읽어들여 저장하는 것이다.

입력받는 함수는 흔히쓰던 scanf()함수도 있고 조금은 생소할 수 있는 gets, fgets가 있다.

지금 3가지 함수에 대해 자세히 알아보려고 한다.

 

 

1. scanf()

scanf()는 우리가 처음 c언어를 배울 때 나오는 것이기 때문에 매우 익숙하다.

scanf()의 특징은 다음과 같다.

- 여러 형식의 데이터를 입력 받을 수 있다. (정수, 실수, 문자, 문자열)

- 입력 버퍼에서 데이터를 공백이나 엔터키로 구분하여 프로그램으로 읽어 드린다.

- 공백또는 엔터키로 문자열을 구분하기 때문에 공백이 포함된 문자열을 입력할 수 없다.

  따라서 긴 공백이 있는 문자열을 입력 받기에 적합하지 않다.

예시 코드 )

#include <stdio.h>

int main(){
  char str[30];
  scanf("%s", str); // input: hello hi
  printf("%s", str); // output: hello 
  return 0;
}

 

2. gets()

gets()의 특징은 다음과 같다.

- 문자열을 한 줄씩 입력받는 함수이다.

- 문자열 끝에 입력된 enter키를 '\0'으로 바꾸어 프로그램이 읽어 드린다.

- 문자열의 시작위치만 알 수 있어 문자열 저장공간의 범위를 넘을 수 있는 위험이 있다.

예시 코드)

#include <stdio.h>

int main(){
  char str[30];
  gets(str); // input: hello hi
  printf("%s", str); // output: hello hi
  
  gets(str); // input: hello hihihihihi abcdefgh
  printf("%s", str); // error

  return 0;
}

 

 

3. fgets()

fgets()의 특징은 다음과 같다.

- 문자열을 입력받는 함수이다.

- enter를 포함한 모든 문자열 끝에 '\0'을 붙여서 읽어 드린다.

- 입력버퍼로 부터 읽어 들릴 수 있는 최대 크기를 지정가능하다.

예시 코드)

#include <stdio.h>

int main(){
  char str[30];
  fgets(str, sizeof(str), stdin); // input : hello hi
  printf("%s\n", str); // output : hello hi

  return 0;
}

 

반응형