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, 0, 10); 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, 0, 10); //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, 0, 10); 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값이 들어갑니다.
'Language & API > C' 카테고리의 다른 글
C C++ 윤년 평년 구하기 (0) | 2017.05.15 |
---|---|
[코딩]VS2013 printf 64bit 주소 출력하기 (0) | 2017.05.02 |
[코딩]문자열 리터럴 연결 (0) | 2017.04.27 |
Visual Studio main 명령 인수 넣기 및 인수 사용방법 (0) | 2015.10.20 |
define 매크로 ##연산자 (0) | 2015.06.19 |