strcat_s | Programming Place Plus C言語編 標準ライブラリのリファレンス

トップページC言語編標準ライブラリのリファレンス(名前順)

トップページC言語編標準ライブラリのリファレンス(ヘッダ別)


strcat_s関数

概要

文字列を連結する。

ヘッダ

string.h

形式 errno_t strcat_s(char* restrict s1, rsize_t s1max, const char* restrict s2);
引数

s1

連結先の配列。ヌルポインタは不可。

s1max

s1 の要素数。

s2

連結元の文字列。ヌルポインタは不可

戻り値

成功したら 0 が返される。何らかのエラーが発生したら 0以外が返される。

詳細

バッファオーバーフローなどの危険を避けつつ、s1 の末尾へ s2 の内容を連結する。s2 の文字列が終端文字も含めて、すべて s1 へ連結できた場合に限って成功であり、0 を返す。0以外の値が返されるときは、実行時制約違反が起きている。

以下のいずれかの場合に、実行時制約違反となる。

  • s1 や s2 がヌルポインタである
  • s1max が 0 であるか、RSIZE_MAX より大きいとき
  • 連結後の文字列の長さが、s1max 以上になる
  • s1 と s2 が使うメモリ領域に重複がある

実行時制約違反となった場合、s1 がヌルポインタでなく、s1max が 0 より大きく RSIZE_MAX 以下であれば、s1[0] にヌル文字が書き込まれる。また、実行時制約ハンドラとして登録されている関数が呼び出される。

実行時制約ハンドラとしてデフォルトで登録されている関数の動作は処理系定義である。set_constraint_handler_s関数を使うと、独自で定義した関数を実行時制約ハンドラとして登録でき、動作を置き換えられる。

この関数は、__STDC_LIB_EXT1__ 事前定義マクロが定義されている処理系でのみ使用できる。また、この関数を使用するのなら、<string.h> をインクルードする前に、__STDC_WANT_LIB_EXT1__ という名前のマクロを、置換結果 1 として定義することが作法となっているが、これを行わずとも関数を使用できる処理系もあり得る。

注意 Visual Studio 2017 に定義されている strcat_s関数は、Microsoft の独自仕様のものである(参考リンク 1 参照)。特に、実行時制約に関する仕様は実装されておらず、代わりに独自仕様のパラメータ検証が行われる。第1引数か第3引数がヌルポインタの場合や、第2引数が連結後の文字数に対して小さすぎる場合にエラーとなる。
使用例
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <string.h>

int main(void)
{
    char s[10] = "12345";

    if (strcat_s(s, sizeof(s), "67890") == 0) {
        puts(s);
    }
}

実行結果:

(停止)
関連

この関数が定義されていない場合は、strcat関数strncat関数を、バッファオーバーフローに注意しつつ使用する。

ワイド文字列版の wcscat_s関数がある。

解説章 逆引き「文字列を連結する」


参考リンク 🔗

  1. strcat_s、wcscat_s、_mbscat_s、_mbscat_s_l | Microsoft Docs
    • Visual Studio 2017 の strcat_s関数のマニュアル


更新履歴 🔗



標準ライブラリのリファレンス(名前順)のトップページへ

標準ライブラリのリファレンス(ヘッダ別)のトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る