Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
strcat() / strncat()
文字列を別の文字列の末尾に連結する関数です。コピー先バッファに十分な空きがあることを確認してから使う必要があります。
構文
// src を dst の末尾に連結します(dst のヌル文字を上書きして src を追加します)。 // 戻り値: dst のポインタ。 char *strcat(char *dst, const char *src); // src の最大 n バイトを dst の末尾に連結します。常にヌル文字を付加します。 // 戻り値: dst のポインタ。 char *strncat(char *dst, const char *src, size_t n);
関数比較
| 関数 | バッファ保護 | ヌル終端 | 概要 |
|---|---|---|---|
| strcat() | なし | あり | dst に十分な空きがないとオーバーフローします。使用には注意が必要です。 |
| strncat() | あり(n文字まで) | あり | n には追加する最大文字数を渡します。dst のバッファサイズではない点に注意します。 |
サンプルコード
#include <stdio.h>
#include <string.h>
int main(void) {
// strcat で文字列を連結します。
char greeting[32] = "Hello";
strcat(greeting, ", ");
strcat(greeting, "World!");
printf("%s\n", greeting); // 『Hello, World!』と出力されます。
// strncat で追加文字数を制限します。
// n には「追加する最大文字数」を渡します(バッファサイズではありません)。
char buf[16] = "abc";
strncat(buf, "XYZXYZXYZ", sizeof(buf) - strlen(buf) - 1);
printf("%s\n", buf); // 『abcXYZXYZXY』(バッファ残量に収まるまで)と出力されます。
// snprintf を使った安全な連結の書き方です。
char result[32] = "";
const char *parts[] = {"foo", "bar", "baz"};
for (int i = 0; i < 3; i++) {
// 現在の長さを取得して残り容量を計算します。
size_t len = strlen(result);
snprintf(result + len, sizeof(result) - len, "%s", parts[i]);
}
printf("snprintf連結: %s\n", result); // 『snprintf連結: foobarbaz』と出力されます。
return 0;
}
概要
strcat() は dst の空き容量を確認しません。連結後の文字列がバッファを超えるとバッファオーバーフローが発生します。動的なデータを扱う場合は snprintf() で残り容量を計算しながら連結してください。
strncat() の第3引数は「追加する最大バイト数」であり、『dst のバッファサイズ』ではありません。正しくは『sizeof(dst) - strlen(dst) - 1』を渡してください。-1 はヌル文字のための空き分です。
文字列コピーの基本は『strlen() / strcpy()』、文字列比較は『strcmp()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。