반응형
C언어 프로그래밍 중 기존 문자열 뒤에 새로운 문자열을 추가해야 할 때가 많습니다. 이때 표준 라이브러리 <string.h>에서 제공하는 문자열 연결 함수인 strcat과 strncat을 사용하게 됩니다.
오늘은 이 두 함수의 동작 차이와 함께, 실무에서 메모리 사고를 막기 위한 안전한 코딩 기법을 정리해 보겠습니다.

1. strcat: 문자열 단순 연결
strcat은 'String Concatenate'의 약자로, 대상 문자열(dest)의 끝에 원본 문자열(src)을 그대로 이어붙입니다.
1.1 동작 방식
- dest 문자열의 끝인 널 문자(\0) 위치를 찾습니다.
- 그 위치부터 src의 내용을 복사해 넣습니다.
- 복사가 끝나면 마지막에 자동으로 널 문자(\0)를 추가합니다.
1.2 예제 코드
C
#include <stdio.h>
#include <string.h>
int main() {
char dest[50] = "Hello, ";
char src[] = "World!";
strcat(dest, src);
printf("결과: %s\n", dest); // 결과: Hello, World!
return 0;
}
⚠️ 주의사항: strcat은 dest의 크기를 체크하지 않습니다. 만약 dest 배열이 작다면 **버퍼 오버플로우(Buffer Overflow)**가 발생하여 시스템이 다운될 수 있습니다.
2. strncat: 길이를 지정하는 안전한 연결
strncat은 strcat의 보안 취약점을 보완하기 위해 만들어졌습니다. 연결할 문자의 개수(n)를 직접 지정할 수 있어 훨씬 안전합니다.
2.1 함수 원형
C
char *strncat(char *dest, const char *src, size_t n);
- n: src에서 가져올 최대 문자의 개수입니다.
2.2 예제 코드
C
#include <stdio.h>
#include <string.h>
int main() {
char dest[20] = "Hello, ";
char src[] = "World!";
// 최대 3글자만 이어붙이기
strncat(dest, src, 3);
printf("결과: %s\n", dest); // 결과: Hello, Wor
return 0;
}
3. strcat vs strncat 한눈에 비교
| 함수 | 주요 역할 | 복사 길이 제한 | 안전성 |
| strcat | 전체 문자열 연결 | 없음 | 위험 (오버플로우 가능성) |
| strncat | 지정한 개수만큼 연결 | 있음 (n개) | 상대적으로 안전함 |
4. [실무 팁] 안전한 strncat 사용 패턴
strncat을 쓸 때 가장 흔히 하는 실수는 n 자리에 전체 버퍼 크기를 넣는 것입니다. 정확히는 '현재 남은 공간'을 계산해서 넣어줘야 합니다.
안전한 남은 공간 계산법
C
#include <stdio.h>
#include <string.h>
#define BUFFER_SIZE 20
int main() {
char dest[BUFFER_SIZE] = "Hello, ";
char src[] = "C Programming World!";
// 1. 전체 크기 - 현재 사용 중인 크기 - 널 문자 공간(1)
size_t available = BUFFER_SIZE - strlen(dest) - 1;
// 2. 남은 공간만큼만 안전하게 복사
strncat(dest, src, available);
printf("최종 결과: %s\n", dest);
return 0;
}
- -1을 하는 이유: 문자열의 끝을 알리는 널 문자(\0)가 들어갈 자리를 반드시 확보해야 하기 때문입니다.
5. 마무리하며
C언어에서 문자열 연결은 메모리 관리와 직결됩니다.
- 단순한 테스트가 아니라면 strcat 보다는 strncat 사용을 습관화하세요.
- 항상 남은 버퍼 크기를 계산하여 n 값을 전달하는 것이 임베디드 및 보안 코딩의 핵심입니다.
이번 포스팅이 여러분의 안전한 C언어 프로그래밍에 도움이 되었기를 바랍니다!
포스팅이 도움이 되셨다면 하트(♥)와 댓글 부탁드립니다!
임베디드 소프트웨어 및 최적화 기법에 대한 전문적인 정보는 'Coding by Head' 블로그에서 계속됩니다.
반응형
'Core Programming > C Standard Library: Resource & Performan' 카테고리의 다른 글
| C언어 문자열 검색 완벽 가이드: strchr과 strstr 함수 사용법 및 차이점 (0) | 2025.02.12 |
|---|---|
| C언어 문자열 비교 완벽 가이드: strcmp와 strncmp 사용법 및 원리 (0) | 2025.02.11 |
| C언어 문자열 함수 총정리: strlen, strcpy, strncpy 안전한 사용법 (0) | 2025.02.09 |
| C언어 파일 입출력 에러 처리 완벽 가이드 (perror, feof, ferror, clearerr) (0) | 2025.02.08 |
| C언어 파일 포인터 위치 제어: fseek, ftell, rewind 완벽 가이드 (0) | 2025.02.07 |