Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ strcat() vs strncat(): 문자열 연결 함수 차이점 총정리

strcat()strncat()은 모두 C++의 <cstring> 헤더에 정의된 표준 문자열 함수로, 문자열을 이어 붙이는 연결 작업에 사용됩니다. 두 함수는 비슷해 보이지만 덧붙일 문자 수를 제어할 수 있는지 여부에서 중요한 차이가 있습니다. 지금부터 각 함수의 문법과 예제, 그리고 두 함수의 차이점을 자세히 알아보겠습니다.

strcat() 함수란?

strcat() 함수는 문자열 연결에 사용됩니다. 원본 문자열(src) 전체를 대상 문자열(dest)의 끝에 덧붙인 뒤, 대상 문자열을 가리키는 포인터를 반환합니다. 함수의 구문은 다음과 같습니다.

char *strcat(char *dest, const char *src)

예제

#include <iostream>
#include <cstring>
using namespace std;
int main() {
    char str1[20] = "Mangoes are ";
    char str2[20] = "yellow";
    strcat(str1, str2);
    cout << "연결된 문자열: " << str1;
    return 0;
}

실행 결과

연결된 문자열: Mangoes are yellow

위 프로그램에서는 두 개의 문자열 str1과 str2를 선언했습니다. strcat() 함수는 str2의 내용 전체를 str1의 끝에 덧붙이고, 그 결과를 cout으로 출력합니다. 해당 코드는 다음 부분입니다.

char str1[20] = "Mangoes are ";
char str2[20] = "yellow";
strcat(str1, str2);
cout << "연결된 문자열: " << str1;

strncat() 함수란?

strncat() 함수 역시 strcat()처럼 문자열 연결에 사용됩니다. 다만 원본 문자열(src)에서 지정한 개수(num)만큼의 문자만 대상 문자열(dest)의 끝에 덧붙이고, 대상 문자열을 가리키는 포인터를 반환합니다. 함수의 구문은 다음과 같습니다.

char * strncat ( char * dest, const char * src, size_t num );

예제

#include <iostream>
#include <cstring>
using namespace std;
int main() {
    char str1[20] = "Mangoes are ";
    char str2[20] = "yellow";
    strncat(str1, str2, 4);
    cout << "연결된 문자열: " << str1;
    return 0;
}

실행 결과

연결된 문자열: Mangoes are yell

위 프로그램에서 strncat()은 str2의 내용 중 앞에서 네 글자("yell")만 str1의 끝에 덧붙입니다. 이후 연결된 문자열이 cout을 통해 출력됩니다. 해당 코드는 다음 부분입니다.

char str1[20] = "Mangoes are ";
char str2[20] = "yellow";
strncat(str1, str2, 4);
cout << "연결된 문자열: " << str1;

strcat()과 strncat()의 주요 차이점

두 함수의 차이를 표로 정리하면 다음과 같습니다.

구분strcat()strncat()
덧붙이는 범위원본 문자열 전체지정한 num개의 문자만
버퍼 오버플로 위험높음 (대상 버퍼 크기 검사 없음)상대적으로 낮음 (문자 수 제한 가능)
자동 널 종료덧붙인 후 '\0' 추가덧붙인 후 '\0' 추가
반환값dest 포인터dest 포인터

두 함수 모두 대상 배열 dest에 결과 문자열과 널 종료 문자('\0')까지 담을 충분한 공간이 있는지 반드시 확인해야 합니다. 공간이 부족하면 버퍼 오버플로가 발생해 프로그램이 비정상 종료되거나 보안 취약점으로 이어질 수 있습니다. 최신 C++에서는 std::string 타입과 + 연산자 또는 append() 메서드를 사용하는 것이 더 안전하고 권장되는 방식입니다.