헤더 파일
<string.h>
사용 목적
memcpy
헤더 파일 사용 목적 메모리 B를 특정 길이(byte 단위) 만큼 메모리 A에 복사한다. 프로토타입과 매개변수 void *memcpy(void *dest, const void *src, size_t n); 1. void *dest : src를 복사해서 넣고자 하는 주..
hasensprung.tistory.com
memcpy를 구현하지만, 중간에 특정 문자를 만나면 중단하고 그다음 주소를 반환하게 된다.
즉, 특정 크기의 바이트만큼 메모리 B를 메모리 A에 복사하다가 특정 문자를 만나면 중단하고 그다음 주소를 반환하는 것이다.
c를 만나지 않는다면, 특정 크기만큼 복사되고 NULL 포인터 값을 반환한다.
프로토타입과 매개변수
void *memccpy(void *dest, const void *src, int c, size_t n);
1. void *dest = 복사해서 붙여 넣고 자 하는 주소
2. const void *src = 복사하고자 하는 주소
3. int c = 중간에 c를 만나게 되면 중단하고 dest의 다음 주소를 반환한다.
4. size_t n = 복사하고자 하는 최대 크기(중간에 c를 만나지 않았을 경우 n(byte) 만큼 복사된다.)
반환값
1. 문자 c를 만났을 때 : c까지 복사를 한 후 dest의 다음 주소를 반환한다.
2. 문자 c를 만나지 못했을 경우 : NULL 포인터 값을 반환한다.
함수의 원리
이해를 돕기 위해 같은 동작을 하는 함수를 만든 것입니다.
void *ft_memccpy(void *dest, const void *src, int c, size_t n)
{
size_t i;
i = 0;
while (i < n) // n의 길이만큼
{
*(unsigned char *)dest = *(const unsigned char *)src; // 복사를 해나가다가
if (*(const unsigned char *)src == (unsigned char)c) // 특정 문자가 있으면
return (dest + 1); // 그 다음 주소를 반환
dest++;
src++;
i++;
}
return (NULL); 끝까지 특정 문자를 찾지 못하면 NULL 포인터 반환
}
사용 예시
#include <string.h>
#include <stdio.h>
int main(void)
{
char str1[] = "abcdefgh";
char str2[] = "abdefgh"; // 중간에 'c'를 생략했다.
char dest1[10];
char dest2[10];
int c = 'c'; // 검사할 문자는 'c'
printf("\nreturn value1 = %p\n", memccpy(dest1, str1, c, 5));
printf("copied dest1 = %s\n\n", dest1);
printf("return value2 = %p\n", memccpy(dest2, str2, c, 5));
printf("copied dest2 = %s\n\n", dest2);
return (0);
}
return value1 = 0x7ffee1c269a0 //dest에서 'c' 다음 주소가 출력된다.
copied dest1 = abc //'c'까지만 복사되었다.
return value2 = 0x0 // NULL 포인터 값이 리턴되었다.
copied dest2 = abdef //부여해준 개수, 즉 5개 모두 복사되었다.
'C언어 > 함수' 카테고리의 다른 글
memset (0) | 2020.09.25 |
---|---|
memmove (0) | 2020.08.10 |
memcpy (0) | 2020.08.10 |
memchr (0) | 2020.08.10 |
memcmp (0) | 2020.08.10 |
strlen (0) | 2020.08.10 |