memccpy
來自 cppreference.com
定義於標頭檔案 <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
[編輯] 示例
執行此程式碼
#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) |
連線兩個字串 (函式) |