名 前
strcpy, strncpy − 文 字 列 を コ ピ ー す る
書 式
#include <string.h>
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
説 明
strcpy() 関 数 は src が 指 す 文 字 列 を 末 尾 の ヌ ル バ イ ト ('\0') も 含 め て dest が 指 す バ ッ フ ァ ー に コ ピ ー す る 。 二 つ の 文 字 列 は 重 な っ て は な ら な い 。 受 け 側 の 文 字 列 dest は コ ピ ー を 受 け 取 る の に 十 分 な 大 き さ で な け れ ば な ら な い 。 バ ッ フ ァ ー オ ー バ ー ラ ン に 気 を 付 け る こ と ! (「 バ グ 」 の 節 を 参 照 )
strncpy() 関 数 も 同 様 だ が 、 src の う ち 最 大 で も n バ イ ト し か コ ピ ー さ れ な い 点 が 異 な る 。 警 告 : src の 最 初 の n バ イ ト の 中 に ヌ ル バ イ ト が な い 場 合 、 dest に 格 納 さ れ る 文 字 列 は ヌ ル で 終 端 さ れ な い こ と に な る 。
src の 長 さ が n よ り も 短 い 場 合 、 strncpy() は dest に 追 加 の ヌ ル バ イ ト を 書 き 込 み 、 全 部 で n バ イ ト が 書 き 込 ま れ る よ う に す る 。
strncpy() の 簡 単 な 実 装 は 以 下 の よ う な 感 じ で あ ろ う :
char *
strncpy(char *dest, const char *src, size_t n)
{
size_t i;
for (i = 0; i
< n && src[i] != '\0'; i++)
dest[i] = src[i];
for ( ; i < n; i++)
dest[i] = '\0';
return dest; }
返 り 値
strcpy() 関 数 と strncpy() 関 数 は 受 け 側 の 文 字 列 destへ の ポ イ ン タ ー を 返 す 。
属 性
マ ル チ ス レ ッ デ ィ ン グ (pthreads(7) 参 照 ) 関 数 strcpy() と strncpy() は ス レ ッ ド セ ー フ で あ る 。
準 拠
SVr4, 4.3BSD, C89, C99.
注 意
strncpy() は 効 率 的 で な く 間 違 い を 起 こ し や す い と 考 え る プ ロ グ ラ マ も い る だ ろ う 。 プ ロ グ ラ マ が dest の 大 き さ が src の 長 さ よ り も 大 き い こ と を 知 っ て い る (つ ま り 、 そ の こ と を チ ェ ッ ク す る コ ー ド を 書 い て い る ) 場 合 は 、 strcpy() を 使 う こ と が で き る 。
strncpy() の 正 し い (か つ 意 図 さ れ た ) 用 途 は 、 C 文 字 列 の 固 定 長 バ ッ フ ァ ー へ の コ ピ ー を 、 バ ッ フ ァ ー が オ ー バ ー フ ロ ー し な い こ と と 、 宛 先 バ ッ フ ァ ー の 未 使 用 バ イ ト が 0 で 埋 め ら れ る こ と の 両 方 を 保 証 し つ つ 行 う こ と で あ る 。 (宛 先 バ ッ フ ァ ー を 0 で 埋 め る の は 、 た い て い の 場 合 、 バ ッ フ ァ ー を 媒 体 に 書 き 込 ん だ り 、 別 の プ ロ セ ス に プ ロ セ ス 間 通 信 を 用 い て 送 信 し た り し た 場 合 に 情 報 洩 れ を 防 ぐ た め で あ る )。
src の 最 初 の n バ イ ト に 終 端 の ヌ ル バ イ ト が な い 場 合 、 strncpy() は dest に 終 端 さ れ て い な い 文 字 列 を 生 成 す る 。 buf の 長 さ が buflen の 場 合 、 以 下 の よ う に し て 強 制 的 に 終 端 す る こ と が で き る 。
strncpy(buf,
str, buflen − 1);
if (buflen > 0)
buf[buflen − 1]= '\0';
(も ち ろ ん 、 上 記 の 方 法 で は 、 src に 入 っ て い る 情 報 が buflen − 1 バ イ ト よ り も 多 い 場 合 に は 、 dest へ の コ ピ ー 時 に 情 報 が 失 わ れ る と い う 事 実 は 無 視 し て い る 。 )
strlcpy() い く つ か の シ ス テ ム (BSD、 Solaris な ど ) で は 以 下 の 関 数 が 提 供 さ れ て い る 。
size_t strlcpy(char *dest, const char *src, size_t size); こ の 関 数 は strncpy() と 同 様 だ が 、 最 大 で も size−1 バ イ ト し か dest に コ ピ ー を せ ず 、 末 尾 へ の 終 端 の ヌ ル バ イ ト の 追 加 が 必 ず 行 わ れ 、 宛 先 バ ッ フ ァ ー (の 未 使 用 部 分 ) へ の ヌ ル バ イ ト の 書 き 込 み が 行 わ れ な い 。 こ の 関 数 で は strcpy() や strncpy() の 持 つ 問 題 の い く つ か が 修 正 さ れ て い る が 、 size が 小 さ す ぎ た 場 合 に は デ ー タ が 失 わ れ る 問 題 に は 、 依 然 と し て 呼 び 出 し 側 で 対 処 す る 必 要 が あ る 。 こ の 関 数 の 返 り 値 は src の 長 さ で あ る 。 こ れ に よ り 、 末 尾 の 切 り 詰 め が 行 わ れ た か を 簡 単 に 検 出 す る こ と が で き る 。 返 り 値 が size 以 上 の 場 合 に は 、 末 尾 の 切 り 詰 め が 発 生 し て い る 。 デ ー タ ロ ス が 問 題 と な る 場 合 は 、 呼 び 出 し 側 で 、 呼 び 出 し 前 に 引 き 数 を チ ェ ッ ク す る か 、 こ の 関 数 の 返 り 値 を 検 査 す る か の い ず れ か を し な け れ ば な ら な い 。 strlcpy() は glibc に は 存 在 せ ず 、 POSIX に よ る 標 準 化 も さ れ て い な い が 、 Linux で は libbsd ラ イ ブ ラ リ 経 由 で 利 用 で き る 。
バ グ
strcpy() の 受 け 側 の 文 字 列 が 十 分 な 大 き さ で な い 場 合 、 何 が 起 こ る か わ か ら な い 。 固 定 長 文 字 列 を 溢 れ さ せ る の は 、 マ シ ン の 制 御 を 掌 中 に 収 め る た め に ク ラ ッ カ ー が 好 ん で 使 う テ ク ニ ッ ク で あ る 。 プ ロ グ ラ ム で デ ー タ を バ ッ フ ァ ー に 読 み 込 ん だ り コ ピ ー し た り す る 場 合 に は 、 必 ず ま ず 最 初 に 十 分 な 大 き さ が あ る か ど う か を チ ェ ッ ク す る 必 要 が あ る 。 プ ロ グ ラ マ が オ ー バ ー フ ロ ー が 不 可 能 だ と 示 せ る 場 合 に は こ の チ ェ ッ ク は 不 要 か も し れ な い が 、 十 分 注 意 す る こ と 。 長 い 間 に は 、 不 可 能 だ っ た こ と が 可 能 に な る よ う な 方 法 で プ ロ グ ラ ム が 変 更 さ れ る こ と も あ る か ら だ 。
関 連 項 目
bcopy(3), memccpy(3), memcpy(3), memmove(3), stpcpy(3), stpncpy(3), strdup(3), string(3), wcscpy(3), wcsncpy(3)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。