名稱空間
變體
操作

strcat, strcat_s

來自 cppreference.com
< c‎ | string‎ | byte
定義於標頭檔案 <string.h>
(1)
char *strcat( char *dest, const char *src );
(直到 C99)
char *strcat( char *restrict dest, const char *restrict src );
(C99 起)
errno_t strcat_s(char *restrict dest, rsize_t destsz, const char *restrict src);
(2) (C11 起)
1)src 指向的以 null 結尾的位元組字串的副本附加到 dest 指向的以 null 結尾的位元組字串的末尾。字元 src[0] 替換 dest 末尾的 null 終止符。結果位元組字串以 null 結尾。
如果目標陣列不足以容納 srcdest 的內容以及終止 null 字元,則行為是未定義的。如果字串重疊,則行為是未定義的。如果 destsrc 都不是指向以 null 結尾的位元組字串的指標,則行為是未定義的。
2)(1) 相同,但它可能會用未指定的值破壞目標陣列的其餘部分(從最後一個寫入的字元到 destsz),並且以下錯誤會在執行時檢測到並呼叫當前安裝的 約束處理程式 函式
  • `src` 或 `dest` 是空指標
  • destsz 為零或大於 RSIZE_MAX
  • dest 的前 destsz 位元組中沒有 null 終止符
  • 會發生截斷(dest 末尾的可用空間不足以容納 src 的每個字元,包括 null 終止符)
  • 源字串和目標字串之間會發生重疊
如果 dest 指向的字元陣列的大小 < strlen(dest)+strlen(src)+1 <= destsz,則行為是未定義的;換句話說,destsz 的錯誤值不會暴露即將發生的緩衝區溢位。
與所有邊界檢查函式一樣,只有當實現定義了 __STDC_LIB_EXT1__ 並且使用者在包含 <string.h> 之前將 __STDC_WANT_LIB_EXT1__ 定義為整數常量 1 時,才能保證 strcat_s 可用。

目錄

[編輯] 引數

dest - 指向要追加的以空字元結尾的位元組字串的指標
src - 指向要複製的以空字元結尾的位元組字串的指標
destsz - 要寫入的最大字元數,通常是目標緩衝區的長度

[編輯] 返回值

1) 返回 `dest` 的副本
2) 成功時返回零,錯誤時返回非零。此外,在錯誤時,將零寫入 dest[0](除非 dest 是空指標或 destsz 為零或大於 RSIZE_MAX)。

[編輯] 注意

因為 strcat 在每次呼叫時都需要尋找到 dest 的末尾,所以使用 strcat 將許多字串連線成一個字串效率很低。

strcat_s 允許從最後一個寫入的字元到 destsz 破壞目標陣列,以提高效率:它可能以多位元組塊複製,然後檢查 null 位元組。

函式 strcat_s 類似於 BSD 函式 strlcat,除了

  • strlcat 截斷源字串以適應目標
  • strlcat 不執行 strcat_s 執行的所有執行時檢查
  • 如果呼叫失敗,strlcat 不會透過將目標設定為空字串或呼叫處理程式來使故障明顯。

儘管 strcat_s 禁止由於潛在安全風險而截斷,但可以使用邊界檢查 strncat_s 來截斷字串。

[編輯] 示例

#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h> 
#include <stdio.h>
#include <stdlib.h>
 
int main(void) 
{
    char str[50] = "Hello ";
    char str2[50] = "World!";
    strcat(str, str2);
    strcat(str, " ...");
    strcat(str, " Goodbye World!");
    puts(str);
 
#ifdef __STDC_LIB_EXT1__
    set_constraint_handler_s(ignore_handler_s);
    int r = strcat_s(str, sizeof str, " ... ");
    printf("str = \"%s\", r = %d\n", str, r);
    r = strcat_s(str, sizeof str, " and this is too much");
    printf("str = \"%s\", r = %d\n", str, r);
#endif
}

可能的輸出

Hello World! ... Goodbye World!
str = "Hello World! ... Goodbye World! ... ", r = 0
str = "", r = 22

[編輯] 參考

  • C11 標準 (ISO/IEC 9899:2011)
  • 7.24.3.1 strcat 函式(p:364)
  • K.3.7.2.1 strcat_s 函式(p:617-618)
  • C99 標準 (ISO/IEC 9899:1999)
  • 7.21.3.1 strcat 函式(p:327)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 4.11.3.1 strcat 函式

[編輯] 另請參閱

連線兩個字串的特定數量的字元
(函式) [編輯]
將一個字串複製到另一個字串
(函式) [編輯]
將一個緩衝區複製到另一個緩衝區,在指定的分隔符處停止
(函式) [編輯]
C++ 文件,關於 strcat