名稱空間
變體
操作

memccpy

來自 cppreference.com
< 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

srcdest 物件被解釋為 unsigned char 陣列。

如果滿足任何條件,則行為是未定義的:

  • 訪問超出了 dest 陣列的末尾;
  • 物件重疊(違反了 restrict 約定)
  • destsrc 是無效或空指標

目錄

[編輯] 引數

dest - 指向要複製到的物件的指標
src - 指向要從中複製的物件的指標
c - 終止位元組,首先轉換為 unsigned char
count - 要複製的位元組數

[編輯] 返回值

如果找到了位元組 (unsigned char)cmemccpy 返回 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

[編輯] 示例

#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

[編輯] 參閱

將一個緩衝區複製到另一個緩衝區
(函式) [編輯]
在兩個不重疊的陣列之間複製一定數量的寬字元
(函式) [編輯]
將一個緩衝區移動到另一個緩衝區
(函式) [編輯]
將一個字串複製到另一個字串
(函式) [編輯]
連線兩個字串
(函式) [編輯]