반응형
C 언어에서 표준 입출력(Standard I/O)을 담당하는 stdio.h
헤더 파일은 다양한 함수들을 제공하며, 그중에서 문자열 입출력을 다루는 puts
와 gets
는 많이 사용되는 함수입니다. 이번 포스팅에서는 puts
와 gets
의 동작 방식, 사용 예제, 그리고 주의해야 할 점에 대해 자세히 알아보겠습니다.
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. puts
와 gets
사용 시 주의할 점
4.1 puts
사용 시 주의할 점
- 개행 문자(
\n
)가 자동으로 추가되므로,printf("%s\n", str);
대신puts(str);
을 사용할 수 있음. - 파일 입출력 시
puts
는stdout
을 사용하므로 파일에 출력하려면fprintf
또는fputs
를 사용해야 함.
4.2 gets
사용 시 주의할 점
gets
는 입력 버퍼 크기를 검사하지 않아 버퍼 오버플로우가 발생할 수 있음.C11
표준에서 제거되었으므로, 최신 C 컴파일러에서는gets
가 사용 불가능할 수 있음.- 대체 함수로
fgets
를 사용할 것.
5. 결론
함수 | 주요 기능 | 주의할 점 |
---|---|---|
puts |
문자열 출력 (개행 자동 추가) | 개행 문자 추가됨, 서식 지정 불가 |
gets |
한 줄 입력 (개행 제거) | 버퍼 오버플로우 발생 가능 (사용 금지) |
fgets |
한 줄 입력 (개행 포함) | \n 을 포함하므로 후처리가 필요 |
C 언어에서 표준 입출력 함수를 사용할 때는 각 함수의 특징을 잘 이해하고 적절하게 사용하는 것이 중요합니다. 특히 gets
는 보안 취약점으로 인해 더 이상 사용하지 않는 것이 좋으며, fgets
를 대안으로 사용하는 것이 바람직합니다.
반응형
'c 언어 > c 표준 라이브러리(Standard C Library)' 카테고리의 다른 글
C 언어 표준 입출력 - `fputs`와 `fgets` 사용법 (0) | 2025.02.04 |
---|---|
stdio.h 개요 및 기본 입출력 함수 `printf`, `scanf` (0) | 2025.02.02 |
C 언어 표준 라이브러리 개요 (0) | 2025.02.02 |