STRCAT(3)

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

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

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

*   src が n バイト以上の場合、 src は NULL 終端されている必要はない。

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

src が n バイト以上の場合、 strncat() は dest に n+1 バイトを書き込む (src からの n バイトと終端の NULL バイトである)。 したがって、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 へのポインタを返す。

準拠
SVr4, 4.3BSD, C89, C99.

注意
いくつかのシステム (BSD、Solaris など) では以下の関数が提供されている。
    size_t strlcat(char *dest, const char *src, size_t size); この関数は、 NULL 終端された文字列 src を文字列 dest に追加する。 具体例には、 size が strlen(dest) より大きい場合には最大で size-strlen(dest)-1 バイトを src からコピーし、 結果の末尾に終端の NULL バイトを追加する。 この関数では 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.54 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。