본문 바로가기
C

strcpy() strcpy_s() (문자열 복사 함수)

by yororing 2024. 6. 21.

00 개요

  • 목적: 문자열을 복사하는 함수인 strcpy()와 strcpy_s()에 대해 정리하고자 함

01 strcpy() 함수란

1. 정의

  • 'string copy'
  • '문자열을 복사한다'
  • 어떤 변수(메모리) 또는 문자열 상수에 저장되어 있는 문자열을 다른 변수(메모리)에 복사 시 사용됨
  • 반환값: char * 형식의 주소
  • NOTE: 복사할 원본 문자열은 반드시 끝에 NULL 문자가 포함되어 있어야 함

2. 문법 (함수의 원형)

  • strcpy 함수의 원형은 string.h에 다음과 같이 선언되어있음
char *strcpy(char *strDestination, const char *strSource);
  • strcpy() 함수는 2개의 parameter를 사용하여 2번째 인자인 strSource 포인터가 가리키는 메모리에 저장된 문자열을 1번째 인자인 strDestination이 가리키는 메모리에 복사함
  • strcpy() 함수는 char * 형식의 주소를 반환하는데 이 주소는 1번째 인자인 strDestination에 전달한 주소와 동일
  • 예시
char str[8];
strcpy(str, "tips"); // str에 "tips" 문자열 복사

char str[8], *p;
p = strcpy(str, "tips"); // 포인터 변수 p에 저장된 주소는 str 배열의 시작 주소와 동일
  • strcpy 함수가 반환한 주소를 포인터 변수 p가 저장하게 됨. 따라서 포인터 변수 p에 저장된 주소는 str 배열의 시작 주소와 동일 

3. strcpy() 함수의 문제점

  • 복사될 메모리의 크기보다 원본 문자열의 크기가 더 크면 버그 발생 가능
  • 예를 들어, 아래와 같이 코드 구성 시 컴파일 할 때는 오류가 나지 않지만 프로그램 실행 시 오류가 나거나 프로그램이 오동작할 수 있음
  • 이유: char str[4]로 설정 시 str 배열의 크기는 총 4 byte까지 문자열 저장 가능하나 'tipsware' 문자열은 NULL 문자까지 포함하면 총 9 byte가 됨. 그런데 이 9 byte 크기의 문자열을 4 byte 크기의 메모리에 저장하려고 하면 메모리 침범이 발생하기에 프로그램이 실행 중 비정상적으로 종료되거나 잘못된 조건으로 동작하게 됨
 char str[4];
 strcpy(str, "tipsware"); // 버그 발생
  • 이러한 문제점 해결하기 위해 strcpy_s() 함수가 제공됨

02 strcpy_s() 함수란

1. 정의

  • strcpy()와 똑같은 기능 제공, strcpy()의 단점을 보안하기 위해 만들어진 함수
  • 반환값: errno_t
    • 0이면 strcpy_s() 함수가 정상적으로 동작했다는 의미 

2. 문법 (함수의 원형)

  • strcpy_s() 함수의 원형은 string.h에 다음과 같이 선언되어있음
errno_t strcpy_s(char *dest, rsize_t dest_size, const char *src);
  • 즉, strcpy() 함수와 유사하지만 dest 변수src 변수 사이에 dest_size (dest가 가리키는 메모리의 크기를 적는 parameter)가 추가됨
  • 즉, strcpy_s() 함수는 복사될 메모리의 크기를 2번째 인자에 반드시 적어줘야 됨
char str[4];
strcpy_s(str, 4, "tipsware");
  • 위의 코드 실행 시 strcpy() 함수일 때에는 잠재적 오류 상태가 되었지만 strcpy_s() 함수 사용하면 프로그램 실행 시에 아래와 같은 디버그 오류 창이 표시됨. 따라서 자신의 소스 코드 중 어떤 코드에서 오류가 발생한 것인지 더 편하게 찾을 수 있음

  •  그리고 2번째 parameter에 사용된 rsize_t 자료형으느 size_t와 동일한 자료형이고 size_t는 unsigned int 자료형과 동일
  • 따라서 dest_size 변수는 부호를 고려하지 않는 32 bit 정수값을 저장함
  • 위의 error를 해결 방법: 문자열의 최대 크기를 아래와 같이 늘려주면 됨
char str[16];
strcpy_s(str, 16, "tipsware");
  • 예시
#include <stdio.h>

typedef struct data {
    int data1;
    char data2[16];
} data_alias;

main() {
    data_alias dts1;
    dts1.data1 = 2024;
    strcpy_s(dts1.data2, 16, "hello");
    printf("%d\n", dts1.data1);
    printf("%s", dts1.data2);
}
  • output

참조

  1. https://blog.naver.com/tipsware/221301499253 
  2.  

 

'C' 카테고리의 다른 글

Declaration vs Definition (선언과 정의)  (0) 2024.06.24
typedef (자료형 별칭 부여 키워드)  (0) 2024.06.21
struct (구조체)  (0) 2024.06.21
sizeof() 연산자  (0) 2024.06.21
전처리기 (Preprocessor, Precompiler)  (0) 2024.06.19