Manpages

名 前

strcat, strncat − 二 つ の 文 字 列 を 連 結 す る

書 式

#include <string.h>

char *strcat(char *dest, const char *src);

char *strncat(char *dest, const char *src, size_t n);

説 明

strcat() 関 数 は 、 dest 文 字 列 の 後 に src 文 字 列 を 付 け 加 え る 。 そ の 際 に 、 dest の 最 後 に あ る 終 端 の ヌ ル バ イ ト ('\0') は 上 書 き さ れ 、 新 た に 生 成 さ れ た 文 字 列 の 末 尾 に 終 端 の ヌ ル バ イ ト が 付 与 さ れ る 。 二 つ の 文 字 列 srcdest は 重 な っ て は な ら な い 。 ま た 、 文 字 列 dest は 、 連 結 後 の 結 果 を 格 納 す る の に 十 分 な 大 き さ で な け れ ば な ら な い 。 dest が 十 分 な 大 き さ で な い 場 合 、 プ ロ グ ラ ム が ど の よ う な 動 作 を す る か 分 か ら な い 。 バ ッ フ ァ ー オ ー バ ー ラ ン は セ キ ュ ア な プ ロ グ ラ ム を 攻 撃 す る 際 に 好 ん で 使 わ れ る 方 法 で あ る 。

strncat() も 同 様 だ が 、 以 下 の 点 が 異 な る 。

*

src の う ち 最 大 n バ イ ト が 使 用 さ れ る 。

*

srcn バ イ ト 以 上 の 場 合 、 src は ヌ ル 終 端 さ れ て い る 必 要 は な い 。

strcat() と 同 じ く 、 dest に 格 納 さ れ る 結 果 の 文 字 列 は 常 に ヌ ル 終 端 さ れ る 。

srcn バ イ ト 以 上 の 場 合 、 strncat() は destn+1 バ イ ト を 書 き 込 む (src か ら の n バ イ ト と 終 端 の ヌ ル バ イ ト で あ る )。 し た が っ て 、 dest の 大 き さ は 最 低 で も strlen(dest)+n+1 で な け れ ば な ら な い 。

strncat() の 簡 単 な 実 装 は 以 下 の よ う な 感 じ で あ ろ う :

char*
strncat(char *dest, const char *src, size_t n)
{
size_t dest_len = strlen(dest);
size_t i;

for (i = 0 ; i < n && src[i] != '\0' ; i++)
dest[dest_len + i] = src[i];
dest[dest_len + i] = '\0';

return dest; }

返 り 値

strcat() 関 数 と strncat() 関 数 は 、 結 果 と し て で き る 文 字 列 dest へ の ポ イ ン タ ー を 返 す 。

属 性

マ ル チ ス レ ッ デ ィ ン グ (pthreads(7) 参 照 ) 関 数 strcat() と strncat() は ス レ ッ ド セ ー フ で あ る 。

準 拠

SVr4, 4.3BSD, C89, C99.

注 意

い く つ か の シ ス テ ム (BSD、 Solaris な ど ) で は 以 下 の 関 数 が 提 供 さ れ て い る 。

size_t strlcat(char *dest, const char *src, size_t size); こ の 関 数 は 、 ヌ ル 終 端 さ れ た 文 字 列 src を 文 字 列 dest に 追 加 す る 。 具 体 例 に は 、 sizestrlen(dest) よ り 大 き い 場 合 に は 最 大 で size−strlen(dest)−1 バ イ ト を src か ら コ ピ ー し 、 結 果 の 末 尾 に 終 端 の ヌ ル バ イ ト を 追 加 す る 。 こ の 関 数 で は strcat() の バ ッ フ ァ ー オ ー バ ー ラ ン が 発 生 す る と い う 問 題 が 修 正 さ れ て い る が 、 size が 小 さ す ぎ た 場 合 に は デ ー タ が 失 わ れ る 問 題 に は 、 依 然 と し て 呼 び 出 し 側 で 対 処 す る 必 要 が あ る 。 こ の 関 数 は strlcat() が 作 成 し よ う と し た 文 字 列 の 長 さ を 返 す 。 返 り 値 が size 以 上 の 場 合 、 デ ー タ ロ ス が 発 生 し て い る 。 デ ー タ ロ ス が 問 題 と な る 場 合 は 、 呼 び 出 し 側 で 、 呼 び 出 し 前 に 引 き 数 を チ ェ ッ ク す る か 、 こ の 関 数 の 返 り 値 を 検 査 す る か の い ず れ か を し な け れ ば な ら な い 。 strlcat() は glibc に は 存 在 せ ず 、 POSIX に よ る 標 準 化 も さ れ て い な い が 、 Linux で は libbsd ラ イ ブ ラ リ 経 由 で 利 用 で き る 。

関 連 項 目

bcopy(3), memccpy(3), memcpy(3), strcpy(3), string(3), strncpy(3), wcscat(3), wcsncat(3)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。