memccpy
|
헤더 파일에 정의됨
<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
참고 항목
|
(C11)
|
한 버퍼를 다른 버퍼로 복사
(함수) |
|
(C95)
(C11)
|
두 개의 겹치지 않는 배열 사이에서 지정된 양의 와이드 문자를 복사
(함수) |
|
(C11)
|
한 버퍼를 다른 버퍼로 이동
(함수) |
|
(C11)
|
한 문자열을 다른 문자열로 복사
(함수) |
|
(C11)
|
두 문자열을 연결
(함수) |