Namespaces
Variants

memccpy

From cppreference.net
< c ‎ | string ‎ | byte
헤더 파일에 정의됨 <string.h>
void * memccpy ( void * restrict dest, const void * restrict src, int c, size_t count ) ;
(C23 이후)

src 가 가리키는 객체로부터 dest 가 가리키는 객체로 바이트를 복사하며, 다음 두 조건 중 어느 하나 가 충족된 후에 중단됩니다:

  • count 바이트가 복사됩니다
  • 바이트 ( unsigned char ) c 가 발견됩니다(그리고 복사됩니다).

src dest 객체는 unsigned char 배열로 해석됩니다.

다음 조건 중 하나라도 충족되면 동작은 정의되지 않습니다:

  • 접근이 dest 배열의 끝을 넘어 발생하는 경우;
  • 객체가 중첩되는 경우 ( restrict 계약 위반)
  • dest 또는 src 가 유효하지 않거나 널 포인터인 경우

목차

매개변수

dest - 복사 대상 객체를 가리키는 포인터
src - 복사 원본 객체를 가리키는 포인터
c - 종료 바이트, 최초에 unsigned char 로 변환됨
count - 복사할 바이트 수

반환값

바이트 ( unsigned char ) c 가 발견되면, memccpy dest 내에서 ( unsigned char ) c 이후의 다음 바이트를 가리키는 포인터를 반환합니다. 그렇지 않으면 널 포인터를 반환합니다.

참고 사항

이 함수는 POSIX memccpy 와 동일합니다.

memccpy ( dest, src, 0 , count ) strncpy ( dest, src, count ) 와 유사하게 동작하지만, 전자는 기록된 버퍼의 에 대한 포인터를 반환하고 대상 배열을 zero-padding하지 않습니다. 따라서 memccpy 는 여러 문자열을 효율적으로 연결하는 데 유용합니다.

char bigString[1000];
char* end = bigString + sizeof bigString;
char* p = memccpy(bigString, "John, ", '\0', sizeof bigString - 1);
if (p)
    p = memccpy(p - 1, "Paul, ", '\0', end - p);
if (p)
    p = memccpy(p - 1, "George, ", '\0', end - p);
if (p)
    p = memccpy(p - 1, "Joel ", '\0', end - p);
if (!p)
    end[-1] = '\0';
puts(bigString); // John, Paul, George, Joel

예제

#include <ctype.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
    const char src[] = "Stars: Altair, Sun, Vega.";
    const char terminal[] = {':', ' ', ',', '.', '!'};
    char dest[sizeof src];
    const char alt = '@';
    for (size_t i = 0; i != sizeof terminal; ++i)
    {
        void* to = memccpy(dest, src, terminal[i], sizeof dest);
        printf("Terminal '%c' (%s):\t\"", terminal[i], to ? "found" : "absent");
        // if `terminal` character was not found - print the whole `dest`
        to = to ? to : dest + sizeof dest;
        for (char* from = dest; from != to; ++from)
            putchar(isprint(*from) ? *from : alt);
        puts("\"");
    }
    puts("\n" "Separate star names from distances (ly):");
    const char *star_distance[] = {
        "Arcturus : 37", "Vega : 25", "Capella : 43", "Rigel : 860", "Procyon : 11"
    };
    char names_only[64];
    char *first = names_only;
    char *last = names_only + sizeof names_only;
    for (size_t t = 0; t != (sizeof star_distance) / (sizeof star_distance[0]); ++t)
    {
        if (first)
            first = memccpy(first, star_distance[t], ' ', last - first);
        else
            break;
    }
    if (first)
    {
        *first = '\0';
        puts(names_only);
    }
    else
        puts("Buffer is too small.");
}

출력:

Terminal ':' (found):   "Stars:"
Terminal ' ' (found):   "Stars: "
Terminal ',' (found):   "Stars: Altair,"
Terminal '.' (found):   "Stars: Altair, Sun, Vega."
Terminal '!' (absent):  "Stars: Altair, Sun, Vega.@"
Separate star names from distances (ly):
Arcturus Vega Capella Rigel Procyon

참고 항목

한 버퍼를 다른 버퍼로 복사
(함수)
두 개의 겹치지 않는 배열 사이에서 지정된 양의 와이드 문자를 복사
(함수)
한 버퍼를 다른 버퍼로 이동
(함수)
한 문자열을 다른 문자열로 복사
(함수)
두 문자열을 연결
(함수)