반응형

안녕하세요.

오늘은 문자열을 복사하는 함수인 strcpy와 strncpy에 대해 알아보도록 하겠습니다.

 

strcpy

함수 원형 
char * strcpy (char *_Dest, const char *_Source);


헤더 파일
string.h


설명  
문자열을 복사를 합니다. 
복사할 문자열(_Source) 변수 크기는 복사될 문자열(_Dest) 변수보다 작거나 같아야 합니다.(종료 null문자 포함)

복사할 문자열(_Source)의 '\0'까지 복사됩니다.


반환 값
_Dest 포인터 값이 반환됩니다.

예제

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <string.h>
 
void main()
{
    char arrString[20= "Hello world!!";
    char arrDestString[20= "TEST";
    strcpy(arrDestString, arrString);
 
    printf("arrString : %s\n", arrString);
    printf("arrDestString : %s\n", arrDestString);
}
 
cs

 

다음과 같이 널까지 그대로 스트링 복사가 됩니다.

 

strncpy

함수 원형 
char * strncpy (char *_Dest, const char *_Source, size_t _Count);

헤더 파일
string.h

설명  
문자열을 _Count만큼 복사를 합니다. 
지정한 크기만큼만 복사합니다.

_Count크기는 _Dest의 데이터 크기보다 작거나 같아야합니다.

반환 값
_Dest 포인터 값이 반환됩니다.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h>
 
void main()
{
    char arrString[20= "Hello world!!";
    char arrDestString[20= "TEST";
    
    strncpy(arrDestString, arrString, 2);
 
    printf("arrString : %s\n", arrString);
    printf("arrDestString : %s\n", arrDestString);
}
 
 
cs

 

arrString의 앞에 두글자(H,e)만 복사가 되게 됩니다. 

근데 이렇게 하면 문제가 생길 수 있습니다.

만약에 6번쨰줄에 arrDestString가 초기값이 없이, 

char arrDestString[20];

이렇게만 선언되어 있는 상태에서 strncpy가 된다면 어떻게 될까요??

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
void main()
{
    char arrString[20= "Hello world!!";
    char arrDestString[20];
 
    strncpy(arrDestString, arrString, 2);
 
    printf("arrString : %s\n", arrString);
    printf("arrDestString : %s\n", arrDestString);
}
 
cs

결과값은 다음과 같이 됩니다.

원하는 결과는 "He"만 복사되어야하는데, "He"가 복사가 되었지만, 먼가 이상한 깨진 글자가 나오고 Hello world!!가 나오네요..

문제는 He를 복사하고 '\0'(null) 문자끝을 나타내는 널이 없기 때문에 출력할 때 이런 문제가 발생하는 겁니다.

다음과 같이 코드를 수정할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
void main()
{
    char arrString[20= "Hello world!!";
    char arrDestString[20];
 
    strncpy(arrDestString, arrString, 2);
 
    arrDestString[2= '\0';
 
    printf("arrString : %s\n", arrString);
    printf("arrDestString : %s\n", arrDestString);
}
 
cs

10번줄에 "arrDestString[2= '\0';" 코드를 추가하였습니다.

결과값은 다음과 같이 원하던대로 "He"만 출력되게 됩니다.

반응형

+ Recent posts