#include <string.h> char *strcat(char *dest, const char *src); char *strncat(char *dest, const char *src, size_t n);
strncat() も同様だが、以下の点が異なる。
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';
インターフェース | 属性 | 値 |
strcat(), strncat() | Thread safety | MT-Safe |
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 ライブラリ経由で利用できる。
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");
} }
[man1]
[man2]
[man3]
[man4]
[man5]
[man6]
[man7]
[man8]
[a]
[b]
[c]
[d]
[e]
[f]
[g]
[h]
[i]
[j]
[k]
[l]
[m]
[n]
[o]
[p]
[q]
[r]
[s]
[t]
[u]
[v]
[w]
[x]
[y]
[z]