c 언어/c 표준 라이브러리(Standard C Library)

C 표준 입출력 - `puts`와 `gets`

임베디드 친구 2025. 2. 3. 08:52
반응형

C 언어에서 표준 입출력(Standard I/O)을 담당하는 stdio.h 헤더 파일은 다양한 함수들을 제공하며, 그중에서 문자열 입출력을 다루는 putsgets는 많이 사용되는 함수입니다. 이번 포스팅에서는 putsgets의 동작 방식, 사용 예제, 그리고 주의해야 할 점에 대해 자세히 알아보겠습니다.


1. puts 함수란?

puts 함수는 문자열을 출력하는 함수로, 문자열을 출력한 후 자동으로 개행(newline)을 추가합니다.

1.1 puts 함수의 정의

int puts(const char *str);
  • str: 출력할 문자열
  • 반환값: 출력이 성공하면 0 이상의 값, 실패하면 EOF (대개 -1)를 반환
  • 문자열 끝에 자동으로 개행 문자가 추가됨

1.2 puts 함수의 사용 예제

#include <stdio.h>

int main() {
    puts("Hello, World!");
    puts("C 언어의 puts 함수 예제입니다.");
    return 0;
}

출력 결과:

Hello, World!
C 언어의 puts 함수 예제입니다.

위 코드에서 puts를 사용하여 두 개의 문자열을 출력하였으며, 각 문자열 끝에는 자동으로 개행 문자가 추가되었습니다.

1.3 printf와의 차이점

비교 항목 puts printf
개행 문자 자동 추가 수동 추가 필요
서식 지정 불가능 가능
반환값 성공 시 양수, 실패 시 EOF 출력된 문자 개수

따라서 단순 문자열을 출력할 때는 puts를 사용하는 것이 편리하지만, 서식을 지정해야 한다면 printf를 사용해야 합니다.


2. gets 함수란? (사용 지양)

gets 함수는 표준 입력(stdin)에서 한 줄을 읽어 문자열로 저장하는 함수입니다. 하지만 보안상의 문제로 인해 사용이 권장되지 않습니다.

2.1 gets 함수의 정의

char *gets(char *str);
  • str: 입력된 문자열을 저장할 버퍼
  • 반환값: 입력된 문자열의 포인터(성공 시), 오류 시 NULL
  • 개행 문자(\n)를 제거하고 문자열 끝에 \0을 추가함

2.2 gets 함수의 사용 예제

#include <stdio.h>

int main() {
    char name[100];
    printf("이름을 입력하세요: ");
    gets(name);
    printf("입력된 이름: %s\n", name);
    return 0;
}

실행 예제:

이름을 입력하세요: 홍길동
입력된 이름: 홍길동

하지만 gets 함수는 버퍼 오버플로우(Buffer Overflow) 문제를 일으킬 수 있기 때문에 C11 표준에서 제거되었습니다. 따라서 gets 대신 fgets 사용을 권장합니다.


3. gets 대신 fgets 사용하기

3.1 fgets 함수 소개

char *fgets(char *str, int size, FILE *stream);
  • str: 입력을 저장할 버퍼
  • size: 최대 입력 길이 (size-1 글자까지만 저장 후 \0 추가)
  • stream: 입력 스트림 (stdin 사용 가능)
  • 반환값: 입력된 문자열의 포인터(성공 시), 실패 시 NULL

3.2 fgets 사용 예제

#include <stdio.h>

int main() {
    char name[100];
    printf("이름을 입력하세요: ");
    fgets(name, sizeof(name), stdin);
    printf("입력된 이름: %s", name);
    return 0;
}

출력 예제:

이름을 입력하세요: 홍길동
입력된 이름: 홍길동

이처럼 fgets최대 입력 길이를 지정할 수 있어 버퍼 오버플로우를 방지할 수 있습니다.


4. putsgets 사용 시 주의할 점

4.1 puts 사용 시 주의할 점

  • 개행 문자(\n)가 자동으로 추가되므로, printf("%s\n", str); 대신 puts(str);을 사용할 수 있음.
  • 파일 입출력 시 putsstdout을 사용하므로 파일에 출력하려면 fprintf 또는 fputs를 사용해야 함.

4.2 gets 사용 시 주의할 점

  • gets입력 버퍼 크기를 검사하지 않아 버퍼 오버플로우가 발생할 수 있음.
  • C11 표준에서 제거되었으므로, 최신 C 컴파일러에서는 gets가 사용 불가능할 수 있음.
  • 대체 함수로 fgets를 사용할 것.

5. 결론

함수 주요 기능 주의할 점
puts 문자열 출력 (개행 자동 추가) 개행 문자 추가됨, 서식 지정 불가
gets 한 줄 입력 (개행 제거) 버퍼 오버플로우 발생 가능 (사용 금지)
fgets 한 줄 입력 (개행 포함) \n을 포함하므로 후처리가 필요

C 언어에서 표준 입출력 함수를 사용할 때는 각 함수의 특징을 잘 이해하고 적절하게 사용하는 것이 중요합니다. 특히 gets는 보안 취약점으로 인해 더 이상 사용하지 않는 것이 좋으며, fgets를 대안으로 사용하는 것이 바람직합니다.

반응형