본문 바로가기

Language & API/C

strcpy 와 strcpy_s 차이점

Vs 2013 에서는 strcpy를 사용하지 못하도록 되어있습니다. 

하지만 아래와 같이 옵션을 No로 변경하면 strcpy를 사용할수 있습니다.. 그리고 되도록 이면 strcpy_s를 사용하면 좋습니다.  


아래 코드를 보면서 strcpy와 strcpy_s에 대해 좀더 설명하도록하겠습니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
 
int main(_In_ int _Argc, _In_reads_(_Argc) _Pre_z_ char ** _Argv, _In_z_ char ** _Env)
{
    char _dest[10= {0,};
    char _Source[10= "123456789";
    //[0] = 1
    //[1] = 2
    //[2] = 3
    //[3] = 4
    //[4] = 5
    //[5] = 6
    //[6] = 7
    //[7] = 8
    //[8] = 9
    //[9] = /0
 
    strcpy(_dest, _Source);
    printf("%s\n", _dest); //out -> 123456789
    
    memset(_dest, 010);
    strcpy_s(_dest, 10, _Source);
    printf("%s\n", _dest); //out -> 123456789
 
    //int delNum = strlen(_dest); //out -> 9  // + 1을 시켜줘야한다.  
    int delNum = strlen(_dest) + 1
    memset(_dest, 0, delNum);
 
    memset(_Source, 010);
    //strcpy(_Source, "0123456789");  //str에 0을 추가 하였다. 
    char *temp = strcpy(_Source, "0123456789012");
    printf("%s\n", _Source); //out -> 0123456789012
    printf("%s\n", temp); //out -> 0123456789012
 
    delNum = strlen(_Source); //out -> 13
 
    strcpy(_dest, _Source);
    printf("%s", _dest); //out -> 0123456789012
 
    memset(_dest, 010);
    strcpy_s(_dest, 10, _Source); // Err 발생
    printf("%s", _dest);
 
    return 0;
}
cs


6번째  배열에 ""를 입력할때 해당 배열크기가 10개이면 9개 글짜까지만 들어갑니다. 이유는 \0 즉 null 값 확보입니다. 

초과 하는 값은 VS intelliSense에서 에러로 표시합니다. 

18번째 줄처럼 strcpy를 일반적으로 사용합니다. 출력해보면 원하는 값을 얻을 수있습니다. 

22번째 strcpy_s 를 일반적으로 사용하면 됩니다. 카피할 숫자와 그 크기를 넣으면 됩니다. 

이때 주의 할점은 그 크기 안에 반드시 \0 값을 포함하고 있어야 합니다.  아니면 Err을 발생합니다. 

31번째 이줄에서 strcpy의 단점이 보입니다. 분면 _Source의 크기는 10이지만 더 큰 글자가 들어갑니다. 

그리고 다음 줄에서 strlen에서 값은 13나옵니다. 

37번째 이줄 역시 에러를 나타내지 않습니다. 

41번재 strcpy_s 에서 10크기동안 Null 값이 없어 Error을 발생시킵니다. _Source = "0123456789012"

만약 크기를 14로 잡으면 strcpy_s에서도 에러없이 진행 됩니다. 


에러는 아래와 같습니다. 


아래는 strcpy 및 strcpy_s의 원형입니다. 

strcpy 원형입니다. 

반환값은 대상 문자열을 반환합니다. 반환값이 없으면 오류를 나타내도록 예약 되어있습니다. 

1
2
3
4
5
char *strcpy(     
    char *strDestination,     
    const char *strSource   
); 
 
cs

strcpy_s 원형입니다. 

반환값은 성공하면 0이고 오류면 값을 뿌려줍니다.

1
2
3
4
5
6
errno_t strcpy_s(    
    char *strDestination,     
    size_t numberOfElements,     
    const char *strSource   
);  
 
cs


간단하게 strcpy -> strcpy_s로 변경하려면 아래와 같이 수정하면 됩니다. 

1
strcpy_s(_dest, strlen(_Source) + 1, _Source);
cs

strlen(_Source) + 1 을 해줘야 \0값이 들어갑니다.