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, Wor
strncat
사용 시 주의할 점
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 개요 및 문자열 관련 함수 (strlen, strcpy, strncpy) (0) | 2025.02.09 |
---|---|
파일 에러 처리 함수(perror, clearerr, feof, ferror) - C 언어 (0) | 2025.02.08 |
C 언어 파일 포인터와 위치 조정 - fseek, ftell, rewind (0) | 2025.02.07 |
C언어 표준 입출력 (stdio.h) - fprintf와 fscanf 사용법 (0) | 2025.02.06 |
C 언어 표준 API - stdio.h의 파일 입출력 (fopen, fclose, fread, fwrite) (0) | 2025.02.05 |