안녕하세요.
오늘은 문자열을 복사하는 함수인 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"만 출력되게 됩니다.
'개발공부 > C언어&C++' 카테고리의 다른 글
[C언어&C++] atoi, atol, atof 함수(문자열을 숫자로 변환) (0) | 2020.03.04 |
---|---|
[C언어&C++] strcmp, strncmp 함수(문자열 비교 함수) (0) | 2020.03.03 |
[C언어 강좌] 제 11강 구조체(struct) (0) | 2020.02.29 |
[C언어 강좌] 제 10강 함수( function ) (0) | 2020.02.28 |
[C언어 강좌] 제 9강 포인터( 포인터변수 ) (0) | 2020.02.27 |