Man page - strncpy(3)

Packages contains this manual

Available languages:

en fr ja ro

Manual

STRCPY

名 前
書 式
説 明
返 り 値
属 性
準 拠
注 意
strlcpy()
バ グ
関 連 項 目
こ の 文 書 に つ い て

名 前

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 へ の ポ イ ン タ ー を 返 す 。

属 性

こ の 節 で 使 用 さ れ て い る 用 語 の 説 明 に つ い て は 、 attributes (7) を 参 照 。

Image grohtml-37181-1.png

準 拠

POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.

注 意

strncpy () は 効 率 的 で な く 間 違 い を 起 こ し や す い と 考 え る プ ロ グ ラ マ も い る だ ろ う 。 プ ロ グ ラ マ が dest の 大 き さ が src の 長 さ よ り も 大 き い こ と を 知 っ て い る (つ ま り 、 そ の こ と を チ ェ ッ ク す る コ ー ド を 書 い て い る ) 場 合 は 、 strcpy() を 使 う こ と が で き る 。

strncpy () の 正 し い (か つ 意 図 さ れ た ) 用 途 は 、 C 文 字 列 の 固 定 長 バ ッ フ ァ ー へ の コ ピ ー を 、 バ ッ フ ァ ー が オ ー バ ー フ ロ ー し な い こ と と 、 宛 先 バ ッ フ ァ ー の 未 使 用 バ イ ト が 0 で 埋 め ら れ る こ と の 両 方 を 保 証 し つ つ 行 う こ と で あ る 。 (宛 先 バ ッ フ ァ ー を 0 で 埋 め る の は 、 た い て い の 場 合 、 バ ッ フ ァ ー を 媒 体 に 書 き 込 ん だ り 、 別 の プ ロ セ ス に プ ロ セ ス 間 通 信 を 用 い て 送 信 し た り し た 場 合 に 情 報 洩 れ を 防 ぐ た め で あ る )。

src の 最 初 の n バ イ ト に 終 端 の ヌ ル バ イ ト が な い 場 合 、 strncpy () は dest に 終 端 さ れ て い な い 文 字 列 を 生 成 す る 。 buf の 長 さ が buflen の 場 合 、 以 下 の よ う に し て 強 制 的 に 終 端 す る こ と が で き る 。

if (buflen > 0) {
strncpy(buf, str, buflen - 1);
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 プ ロ ジ ェ ク ト の リ リ ー ス 5.10 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は https://www.kernel.org/doc/man-pages/ に 書 か れ て い る 。