Man page - strcat(3)

Packages contains this manual

Available languages:

en fr pl ja ro de

Manual

STRCAT

名 前
書 式
説 明
返 り 値
属 性
準 拠
注 意

プ ロ グ ラ ム の ソ ー ス
関 連 項 目
こ の 文 書 に つ い て

名 前

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

属 性

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

Image grohtml-39391-1.png

準 拠

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

注 意

い く つ か の シ ス テ ム (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 ラ イ ブ ラ リ 経 由 で 利 用 で き る 。

Because strcat () and strncat () must find the null byte that terminates the string dest using a search that starts at the beginning of the string, the execution time of these functions scales according to the length of the string dest . This can be demonstrated by running the program below. (If the goal is to concatenate many strings to one target, then manually copying the bytes from each source string while maintaining a pointer to the end of the target string will provide better performance.)

プ ロ グ ラ ム の ソ ー ス

#include <stdint.h>
#include <string.h>
#include <time.h>
#include <stdio.h>

int
main(int argc, char *argv[])
{
#define LIM 4000000
char p[LIM + 1]; /* +1 for terminating null byte */
time_t base;

base = time(NULL);
p[0] = '\0';

for (int j = 0; j < LIM; j++) {
if ((j % 10000) == 0)
printf("%d %jd\n", j, (intmax_t) (time(NULL) - base));
strcat(p, "a");
}
}

関 連 項 目

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

こ の 文 書 に つ い て

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