名 前
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') は 上 書 き さ れ 、 新 た に 生 成 さ れ た 文 字 列 の 末 尾 に 終 端 の ヌ ル バ イ ト が 付 与 さ れ る 。 二 つ の 文 字 列 src と dest は 重 な っ て は な ら な い 。 ま た 、 文 字 列 dest は 、 連 結 後 の 結 果 を 格 納 す る の に 十 分 な 大 き さ で な け れ ば な ら な い 。 dest が 十 分 な 大 き さ で な い 場 合 、 プ ロ グ ラ ム が ど の よ う な 動 作 を す る か 分 か ら な い 。 バ ッ フ ァ ー オ ー バ ー ラ ン は セ キ ュ ア な プ ロ グ ラ ム を 攻 撃 す る 際 に 好 ん で 使 わ れ る 方 法 で あ る 。
strncat() も 同 様 だ が 、 以 下 の 点 が 異 な る 。
* |
src の う ち 最 大 n バ イ ト が 使 用 さ れ る 。 | ||
* |
src が n バ イ ト 以 上 の 場 合 、 src は ヌ ル 終 端 さ れ て い る 必 要 は な い 。 |
strcat() と 同 じ く 、 dest に 格 納 さ れ る 結 果 の 文 字 列 は 常 に ヌ ル 終 端 さ れ る 。
src が n バ イ ト 以 上 の 場 合 、 strncat() は dest に n+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 に 追 加 す る 。 具 体 例 に は 、 size が strlen(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/ に 書 か れ て い る 。