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 が無効なポインタまたはnullポインタである
目次 |
パラメータ
| 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)
|
2つの重複しない配列間で指定された量のワイド文字をコピーする
(関数) |
|
(C11)
|
バッファを別のバッファに移動する
(関数) |
|
(C11)
|
文字列を別の文字列にコピーする
(関数) |
|
(C11)
|
2つの文字列を連結する
(関数) |