Core Programming/C Standard Library: Resource & Performan

C언어 문자열 이어붙이기 완벽 가이드: strcat과 strncat의 안전한 사용법

임베디드 친구 2025. 2. 10. 00:38
반응형

C언어 프로그래밍 중 기존 문자열 뒤에 새로운 문자열을 추가해야 할 때가 많습니다. 이때 표준 라이브러리 <string.h>에서 제공하는 문자열 연결 함수인 strcat과 strncat을 사용하게 됩니다.

오늘은 이 두 함수의 동작 차이와 함께, 실무에서 메모리 사고를 막기 위한 안전한 코딩 기법을 정리해 보겠습니다.

Generated by Gemini AI.


1. strcat: 문자열 단순 연결

strcat은 'String Concatenate'의 약자로, 대상 문자열(dest)의 끝에 원본 문자열(src)을 그대로 이어붙입니다.

1.1 동작 방식

  1. dest 문자열의 끝인 널 문자(\0) 위치를 찾습니다.
  2. 그 위치부터 src의 내용을 복사해 넣습니다.
  3. 복사가 끝나면 마지막에 자동으로 널 문자(\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언어에서 문자열 연결은 메모리 관리와 직결됩니다.

  1. 단순한 테스트가 아니라면 strcat 보다는 strncat 사용을 습관화하세요.
  2. 항상 남은 버퍼 크기를 계산하여 n 값을 전달하는 것이 임베디드 및 보안 코딩의 핵심입니다.

이번 포스팅이 여러분의 안전한 C언어 프로그래밍에 도움이 되었기를 바랍니다!


포스팅이 도움이 되셨다면 하트(♥)와 댓글 부탁드립니다!

임베디드 소프트웨어 및 최적화 기법에 대한 전문적인 정보는 'Coding by Head' 블로그에서 계속됩니다.

https://coding-by-head.tistory.com/

반응형