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
)
,不同之处在于前者返回指向写入缓冲区
末尾
的指针,并且不会用零填充目标数组。因此,
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
标签内的代码均保持原样
- C++专业术语(如char、sizeof、memccpy等)未翻译
- 仅注释内容"// 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)
|
连接两个字符串
(函数) |