42.2 문자열 붙이기

문자열은 strcat 함수를 사용하여 서로 붙일 수 있으며 함수 이름은 문자열을 연결시키다(string concatenate)에서 따왔습니다(string.h 헤더 파일에 선언되어 있습니다).

  • strcat(최종문자열, 붙일문자열);
    • char *strcat(char *_Destination, char const *_Source);
    • 최종 문자열의 포인터를 반환

다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

string_concatenate_array_to_array.c

#define _CRT_SECURE_NO_WARNINGS    // strcat 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
#include <string.h>    // strcat 함수가 선언된 헤더 파일

int main()
{
    char s1[10] = "world";
    char s2[20] = "Hello"; // s2 뒤에 붙일 것이므로 배열 크기를 크게 만듦

    strcat(s2, s1);        // s2 뒤에 s1를 붙임

    printf("%s\n", s2);    // Helloworld

    return 0;
}

실행 결과

Helloworld

strcat(s2, s1)과 같이 strcat 함수에 최종 결과가 나올 문자열과 붙일 문자열을 넣습니다. 이렇게 하면 s2 뒤에 s1를 붙여서 Helloworld가 나옵니다.

여기서 주의할 부분은 최종 결과가 나올 문자열의 배열 크기입니다. 문자열을 붙이더라도 배열이 모자라지 않도록 크기를 넉넉하게 만듭니다(NULL까지 들어갈 수 있도록).

그림 42‑4 strcat 함수로 문자열 붙이기

지금까지 배열 형태로 된 문자열을 붙였습니다. 그러면 문자열 포인터는 어떻게 붙일까요? 다음 내용을 소스 코드 편집 창에 입력한 뒤 F5 키를 눌러서 디버깅 모드로 실행해보세요.

string_concatenate_pointer_to_pointer_error.c

#define _CRT_SECURE_NO_WARNINGS    // strcat 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
#include <string.h>    // strcat 함수가 선언된 헤더 파일

int main()
{
    char *s1 = "world";    // 문자열 포인터
    char *s2 = "Hello";    // 문자열 포인터

    strcat(s2, s1);    // 실행 에러

    printf("%s\n", s1);

    return 0;
}

실행 결과

0xC0000005: 0x013A585D 위치를 기록하는 동안 액세스 위반이 발생했습니다.

strcat 함수로 문자열 포인터 s2 뒤에 문자열 포인터 s1을 붙였습니다. 하지만 실행해보면 에러가 발생합니다. 문자열 포인터 s2는 읽기 전용 메모리라서 문자열을 붙일 수 없습니다.

그림 42‑5 문자열 포인터에는 문자열을 붙일 공간이 없음

문자열을 붙이려면 s2에 쓰기가 가능하도록 malloc 함수로 동적 메모리를 할당하고, 문자열을 붙일 수 있도록 공간도 넉넉하게 20으로 설정해줍니다.

string_concatenate_pointer_to_memory.c

#define _CRT_SECURE_NO_WARNINGS    // strcpy 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
#include <string.h>    // strcat 함수가 선언된 헤더 파일
#include <stdlib.h>    // malloc, free 함수가 선언된 헤더 파일

int main()
{
    char *s1 = "world";                      // 문자열 포인터
    char *s2 = malloc(sizeof(char) * 20);    // char 20개 크기만큼 동적 메모리 할당

    strcpy(s2, "Hello");   // s2에 Hello 문자열 복사

    strcat(s2, s1);       // s2 뒤에 s1을 붙임

    printf("%s\n", s2);   // Helloworld

    free(s2);    // 동적 메모리 해제

    return 0;
}

실행 결과

Helloworld

먼저 char *s2 = malloc(sizeof(char) * 20);처럼 char 20개 크기만큼 동적으로 메모리를 할당합니다. 그리고 메모리가 할당된 문자열 포인터에는 문자열을 =로 직접 할당할 수 없으므로 strcpy 함수를 사용하여 s2"Hello" 문자열을 복사합니다.

s2가 준비되었으면 strcat 함수로 문자열 포인터 s2 뒤에 문자열 포인터 s1을 붙이면 됩니다. 문자열 사용이 끝났다면 반드시 free 함수로 동적 할당한 메모리를 해제합니다.

그림 42‑6 문자열 포인터에 메모리를 할당한 뒤 문자열을 붙임