C 언어 string.h의 strcat과 strncat 함수 이해하기
C 언어에서 문자열을 다룰 때 필수적으로 사용되는 표준 라이브러리 <string.h>에는 다양한 문자열 처리 함수가 포함되어 있습니다. 그중 strcat과 strncat 함수는 기존 문자열에 새로운 문자열을 이어붙일 때 사용됩니다.
이번 포스팅에서는 strcat과 strncat 함수의 동작 방식과 차이점을 알아보고, 예제 코드를 통해 올바르게 사용하는 방법을 설명하겠습니다.
1. strcat 함수
strcat 함수는 첫 번째 문자열(dest)의 끝에 두 번째 문자열(src)을 추가합니다. 이때 dest의 끝에 src를 복사한 후, 널 문자(\0)를 자동으로 추가합니다.
strcat 함수의 선언
char *strcat(char *dest, const char *src);strcat 함수의 동작 방식
dest문자열의 끝(\0)을 찾습니다.src의 내용을dest의 끝에 복사합니다.- 마지막에
\0을 추가합니다.
strcat 함수 사용 예제
#include <stdio.h>
#include <string.h>
int main() {
char dest[50] = "Hello, ";
char src[] = "World!";
strcat(dest, src);
printf("결과: %s\n", dest);
return 0;
}실행 결과
결과: Hello, World!strcat 사용 시 주의할 점
dest배열의 크기가 충분하지 않으면 버퍼 오버플로우가 발생할 수 있습니다.dest의 크기를 고려하지 않고 사용하면 메모리 오류가 발생할 수 있습니다.
2. strncat 함수
strncat 함수는 strcat과 비슷하지만, src에서 복사할 최대 길이를 지정할 수 있습니다. 이를 통해 버퍼 오버플로우를 방지할 수 있습니다.
strncat 함수의 선언
char *strncat(char *dest, const char *src, size_t n);strncat 함수의 동작 방식
dest문자열의 끝(\0)을 찾습니다.src에서 최대n개의 문자를dest에 복사합니다.- 마지막에
\0을 추가합니다.
strncat 함수 사용 예제
#include <stdio.h>
#include <string.h>
int main() {
char dest[20] = "Hello, ";
char src[] = "World!";
strncat(dest, src, 3);
printf("결과: %s\n", dest);
return 0;
}실행 결과
결과: Hello, Worstrncat 사용 시 주의할 점
n값이src의 길이보다 크더라도src의 끝까지 복사되며,\0이 자동 추가됩니다.dest의 남은 공간을 고려하여n값을 조정해야 합니다.dest크기보다 많이 복사하면 버퍼 오버플로우가 발생할 수 있습니다.
3. strcat과 strncat 비교
| 함수 | 역할 | 복사 길이 제한 | 안전성 |
|---|---|---|---|
strcat |
문자열을 추가 | 없음 | 버퍼 오버플로우 위험 |
strncat |
문자열을 추가 | 있음 (n개까지) |
상대적으로 안전 |
4. strncat을 사용할 때 주의할 점
C 언어의 문자열 처리 함수는 대부분 버퍼 크기를 직접 관리해야 하므로, strncat을 사용할 때도 dest의 크기를 초과하지 않도록 주의해야 합니다.
아래 코드를 보면, strncat 사용 시 dest의 최대 크기를 고려하지 않으면 문제가 발생할 수 있습니다.
안전한 strncat 사용 예제
#include <stdio.h>
#include <string.h>
#define BUFFER_SIZE 20
int main() {
char dest[BUFFER_SIZE] = "Hello, ";
char src[] = "World!";
// dest의 남은 공간을 계산하여 안전하게 복사
size_t available_space = BUFFER_SIZE - strlen(dest) - 1;
strncat(dest, src, available_space);
printf("결과: %s\n", dest);
return 0;
}실행 결과
결과: Hello, World!위 코드에서는 BUFFER_SIZE에서 strlen(dest)과 마지막 널 문자(\0)를 위한 1바이트를 제외한 available_space만큼만 strncat이 복사하도록 설정했습니다. 이렇게 하면 안전하게 문자열을 이어 붙일 수 있습니다.
5. 결론
strcat과 strncat은 문자열을 연결할 때 유용한 함수지만, 잘못 사용하면 버퍼 오버플로우가 발생할 수 있습니다. 특히 strcat은 복사 길이 제한이 없으므로 항상 충분한 크기의 버퍼를 확보해야 합니다.
안전한 코드 작성을 위해 strncat을 사용할 때는 dest의 남은 공간을 고려하여 적절한 n 값을 지정하는 것이 중요합니다.
핵심 정리
strcat은 문자열을 단순히 연결하지만, 버퍼 크기를 초과할 위험이 있음.strncat은 복사할 길이를 제한할 수 있어 상대적으로 안전함.strncat사용 시dest의 남은 공간을 고려해야 함.
이번 포스팅이 strcat과 strncat을 이해하는 데 도움이 되었길 바랍니다! 다음에도 유용한 C 언어 표준 라이브러리 함수에 대해 다뤄보겠습니다.
'c 언어 > c 표준 라이브러리(Standard C Library)' 카테고리의 다른 글
| C 언어 `string.h`의 문자열 검색 함수 - `strchr`와 `strstr` (0) | 2025.02.12 |
|---|---|
| C 언어 문자열 비교 API - strcmp와 strncmp (0) | 2025.02.11 |
| C 표준 라이브러리 string.h 개요 및 문자열 관련 함수 (strlen, strcpy, strncpy) (0) | 2025.02.09 |
| C 파일 에러 처리 함수(perror, clearerr, feof, ferror) (0) | 2025.02.08 |
| C 언어 파일 포인터와 위치 조정 - fseek, ftell, rewind (0) | 2025.02.07 |