strcat, strcat_s
來自 cppreference.com
定義於標頭檔案 <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 結尾。 如果目標陣列不足以容納
src
和 dest
的內容以及終止 null 字元,則行為是未定義的。如果字串重疊,則行為是未定義的。如果 dest
或 src
都不是指向以 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)