72. 문자열 복사

C언어에서 문자열을 char 형식을 원소로 하는 배열이나 포인터를 사용하죠.
특히 문자열을 변경하는 작업을 하려면 배열을 사용한다고 했어요.
그런데 C언어에서 배열 이름은 포인터 상수로 취급하여 대입 연산 좌항에 올 수 없어요.

C 언어에서 문자열 데이터를 복사할 때는 다음 함수를 사용할 수 있어요.

char *strcpy(char *dest, const char *src);
char *strcpy_s(char *dest, size_t size, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
char *strncpy_s(char *dest, size_t size, const char *src, size_t n);

입력 인자는 문자열을 복사할 주소와 원본 문자열을 받아요.
문자열을 복사하기 위해서 첫 번째 인자는 const 키워드가 없어요.
반환 형식은 char *로 첫 번째 인자 그대로 반환한답니다.
printf(“%s\n”, strcpy(name,”hello”));처럼 연쇄 작업을 할 수 있게 반환는 것으로 다른 특별한 의미는 없어요.

그리고 strcpy 함수와 strncpy 함수는 src가 가리키는 문자열의 길이나 복사할 길이 n이 dest 버퍼 크기보다 크면 버퍼 오버플로우 버그가 발생할 수 있어요.
strcpy_s와 strncpy_s는 dest 버퍼의 크기를 두 번째 입력 인자로 받아요.
dest 버퍼 크기를 받아 내부에서 버퍼 오버플로우 버그가 발생하지 않게 개선한 함수예요.

◈ 문자열 복사

#include <stdio.h>
#include <string.h>
#define MAX_NAME_LEN      50
int main()
{
    char name1[MAX_NAME_LEN+1] = "hello";
    char name2[MAX_NAME_LEN+1] = "";
    char name3[MAX_NAME_LEN+1] = "";
 
    strcpy_s(name2,sizeof(name2),name1);
    printf("%s\n",name2);
    strncpy_s(name3,sizeof(name3),name1,3);
    printf("%s\n",name3);
    return 0;
}

◈ 실행 결과

hello
hel

strncpy 함수를 사용하면 복사한 문자 뒤에 널문자를 대입해 주지 않아요.
이러한 이유로 초기화하지 않고 사용하면 쓰레기 값이 남아있을 수 있으므로 주의하세요.

이 외에도 문자열을 사용하기 위한 다양한 함수들을 제공하고 있어요.

C언어 표준 라이브러리 함수를 참고하세요.

[C 언어 표준 라이브러리 함수 가이드]는 C언어 표준 라이브러리 함수에 관한 사용법을 다루고 있습니다.