memcpy 함수의 헤더 파일
#include <string.h>
memcpy() 함수의 원형
char * strncpy(char * des, const char * src, size_t num);
Parameter
des
데이터를 복사할 주소이고 char * 형으로 변환되어서 전달된다.
주소를 전달해주면 된다.
src
복사할 데이터가 존재하는 위치의 주소이고 char * 형으로 변환되어서 전달된다.
주소를 전달해주면 된다.
num
복사할 데이터의 byte 수이며 size_t 형으로 전달해주면 된다.
strncpy() 함수는 src 위치부터 특정 바이트 수만큼 복사하여 des로 복사해주는 함수이다.
strcpy()함수를 다룰때 설명했듯이 strcpy()함수는 '\0' 함수가 오기까지 복사해주는 함수이므로 사용에 주의를 해야 한다고 했다. (strcpy()함수가 먼지 모르겠다면?)
strncpy() 함수는 strcpy()함수와는 다르게 특정 바이트만큼 복사하기 때문에 사용상에 좀 더 편의성을 갖고 있지만 한가지 알아둬야 할 사항이 있다.
특정 바이트를 복사할때 '\0' 문자가 포함되는 지는 src 함수의 num byte 안에 '\0'이 포함되는지 이다.
이게 먼말이냐면
이렇게 SRC 위치에 HELLO가 있는데 5 Byte만 복사하면 DES HELLO 5 Byte 만큼 복사된다.'\0'이 없으니 문자열을 끝을 알 수가 없다......... 마지막 5 Byte를 '\0'으로 변경해주는 게 좋다.
그런데 SRC 위치에서 6 Byte를 복사하면??? HELLO'\0' 이 복사가 되서 문자열을 구분할 수 있게 된다.
자 한번 확인해보자.
13 Byte(문자열 길이) 만큼만 복사했을 경우
#include <stdio.h>
#include <string.h>
int main(){
char str1[13] = "hello world!!";
char str2[20] = {0};
char * des = NULL;
memset(str2, 0x30, 19); //str2를 0x30으로 초기화
printf("*************************\n");
printf("[before addr and str]\n"); //strncpy 함수 실행 이전의 주소 및 값
printf("str1 addr : %x\n", str1);
printf("str2 addr : %x\n", str2);
printf("str1: [%s]\n", str1);
printf("str2: [%s]\n", str2);
printf("des: [%s]\n", des);
des = strncpy(str2, str1, 13); //13 Byte(문자열 길이) 만큼만 복사했을 경우
printf("*************************\n");
printf("[after addr and str]\n"); //strncpy 함수 실행 이후의 주소 및 값
printf("str1 addr : %x\n", str1);
printf("str2 addr : %x\n", str2);
printf("des addr : %s\n", des);
printf("str1: [%s]\n", str1);
printf("str2: [%s]\n", str2);
printf("des: [%s]\n", des);
printf("*************************\n");
return 0;
}
실행 결과
14 Byte(문자열 길이 + 1) 만큼 복사했을 경우
#include <stdio.h>
#include <string.h>
int main(){
char str1[20] = "hello world!!";
char str2[20] = {0};
char * des;
memset(str2, 0x30, 19); //str2를 0x30으로 셋팅
printf("*************************\n");
printf("[before addr and str]\n"); //strncpy 실행 이전의 주소 및 값
printf("str1 addr : %x\n", str1);
printf("str2 addr : %x\n", str2);
printf("str1: [%s]\n", str1);
printf("str2: [%s]\n", str2);
printf("des: [%s]\n", des);
des = strncpy(str2, str1, 14); //
printf("*************************\n");
printf("[after addr and str]\n"); //strncpy 실행 이후의 주소 및 값
printf("str1 addr : %x\n", str1);
printf("str2 addr : %x\n", str2);
printf("des addr : %s\n", des);
printf("str1: [%s]\n", str1);
printf("str2: [%s]\n", str2);
printf("des: [%s]\n", des);
printf("*************************\n");
return 0;
}
실행 결과
실행결과를 보면 알겠지만
1. SRC '\0'이 없다면 strcpy() 함수의 num Byte의 마지막 byte를 '\0'으로 초기화 해주는게 좋습니다.
혹은
2. num byte를 SRC의 문자열 길이 + 1 해줘도 됩니다.
그래도 2번은 찝찝하니 1번을 쓰는게 좋겠죠?
다른 string.h 파일의 함수에 대해 알고 싶으시다면 String.h 함수 파헤치기!!
C언어 라이브러리 - String.h 헤더 파일 분석하기(String.h 함수 모음, C언어 래퍼런스)
c언어를 사용하시거나 해보셨던 분들은 대부분 memcpy, memset 함수를 사용해보셨을 텐데요. 해당 함수를 사용하기 위해서는 String.h 파일을 포함시켜줬던 기억이 나실겁니다. 요렇게요 #include #include
idsn.tistory.com
'C 언어 > C 언어 리이브러리 함수' 카테고리의 다른 글
[C언어] String.h 라이브러리 함수 - strncat() 함수 파헤치기 (0) | 2021.01.31 |
---|---|
[C언어] String.h 라이브러리 함수 - strcat() 함수 파헤치기 (0) | 2021.01.28 |
[C언어] String.h 라이브러리 함수 - strcpy() 함수 파헤치기 (0) | 2021.01.20 |
[C언어] String.h 라이브러리 함수 - memmove() 함수 파헤치기 (0) | 2021.01.18 |
[C언어] String.h 라이브러리 함수 - memcpy() 함수 파헤치기 (0) | 2021.01.17 |