strncpy、strcpy_s、 strncpy_s、strlcpy、strncat、strcat_s、 strncat_s、 strlcat等字符串函數彙總

調查報告:整理並用實驗比較分析strncpy、strcpy_s、 strncpy_s、strlcpy、strncat、strcat_s、 strncat_s、 strlcat等函數的異同

包含在頭文件 string .h 中。

Strncpy: 函數原型:char *strncpy( char *dest, const char *src, std::size_t count );
比較:strcpy 的可以添加參數,表示複製 n 個字符,而不是像 strcpy 尋找”\0”把所有字符拷貝。特別的,若 n 大於待複製的字符串,‘\0’填充至 n 個。參數來源爲用戶輸入,故安全性不好。(相對 strcpy 較安全)並且注意,如果 src 的前 n 個字節不含 NULL 字符,則結果不會以 NULL 字符結束。

Strlcpy:
原型:strlcpy(char *dst, const char *src, size_t siz);
比較:類似 strncpy,但是,使用 strlcpy,就不需要我們去手動負責 \0 了,僅需要把 sizeof(dst) 告之 strlcpy 特別的,strlcpy 並不屬於 ANSI C,至今也還不是標準。

strcpy_s:
函數原型:
errno_t __cdecl strcpy_s(char*_Destination,rsize_t _SizeInBytes,char const* _Source); strlcpy
功能比較:複製字符串_Source 中的字符到字符串_Destination,其中限制了大小爲 _SizeInBytes,這是爲了防止字符串過長超出緩存區內存引發問題而要求的。

Strncpy _s: 原型:errno_t strncpy_s(char * restrict dest,rsize_t destsz,const char * restrict src,rsize_t count);
參數說明:
Dest:指向要複製到的字符數組的指針 SRC:指向要複製的字符數組的指針 count 最大數量的字符複製 destsz 目標緩衝區的大小特別的,加_s 版本則是從 VS2005 開始推出的安全版本。
相對安全,在接口增加了一個參數 numElems 來表明 dest 中的字節數,比較:正如後 C11 DR 468 所糾正的那樣,strncpy_s 與 strcpy_s 不同,只有在發生錯誤時才允許對目標數組的其餘部分進行截斷。
與 strncpy 不同,strncpy_s 不會用零填充目標數組,這是將現有代碼轉換爲邊界檢查版本時常見的錯誤來源。
儘管適合目標緩衝區的截斷存在安全風險,並因此違反了 strncpy_s 的運行時間約束,但可以通過指定 count 等於目標數組的大小減 1 來獲得截斷行爲:它將複製第一個計數字節和像往常一樣追加空終止符:strncpy_s(dst,sizeof dst,src,(sizeof dst)-1);

Strncat:
函數原型:char * strncat(char * dest,const char * src,size_t count);
特性:1)追加由 src 指向的字符數組中的大多數計數字符,如果找到空字符,則停止到由 dest 指向的以 null 結尾的字節字符串的末尾。 字符 src [0]替換 dest 結尾處的空終止符。 終止空字符總是附加在最後(因此函數可以寫入的最大字節數爲 count + 1)。
2)與(1)相同,只是此函數可能會打斷目標數組的其餘部分(從寫入到 destsz 的最後一個
字節開始),並且在運行時檢測到以下錯誤並調用當前安裝的約束處理函數: src 或者 dest 是空指針
destsz 或者 count 是零或大於 RSIZE_MAX 在第一個 destsz 字節中沒有空字符 dest 則會發生截斷:count 或者 src 較小者的長度超過了 dest 和 destsz 的空終止符之間的可用空間。
源和目標字符串之間會發生重疊

比較:儘管適合目標緩衝區的截斷存在安全風險,並且因此違反了 strncat_s 的運行時間約束,但可以通過指定 count 等於目標數組的大小減 1 來獲得截斷行爲:它將複製第一個計數字節和 像往常一樣添加空終止符:strncat_s(dst,sizeof dst,src,(sizeof dst)-strnlen_s
(dst,sizeof dst)-1);

strcat_s:
函數原型:errno_t strcat_s(char * restrict dest,rsize_t destsz,const char * restrict src);
(C11)比較:爲了提高效率,strcat_s 允許從最後寫入 destsz 的字符中截斷目標數組:它可以複製多字節塊,然後檢查空字節。

strncat_s:函數原型:errno_t strncat_s(char * restrict dest,rsize_t destsz,const char * restrict src, rsize_t count);

參數說明:
Dest 指向要附加到的以空字符結尾的字節字符串
SRC 指向要複製的字符數組的指針
Count 最大數量的字符複製
Destsz 目標緩衝區的大小
比較:如果由 dest <strnlen(dest,destsz)+ strnlen(src,count)+1 <destsz;指向的字符數組的大小,行爲是不確定的。 換句話說,destsz 的錯誤值不會暴露即將發生的緩衝區溢出。 如果字符數組的大小由 src <strnlen(src,count)<destsz; 換句話說,count 的錯誤值不會暴露即將發生的緩衝區溢出。 作爲所有邊界檢查函數,只有當__STDC_LIB_EXT1__由實現定義並且在包含 string.h 之前用戶將__STDC_WANT_LIB_EXT1__定義爲整數常量 1 時, strncat_s 才能保證可用。

strlcat:
函數原型:
size_t strlcat(char *dest, const char *src, size_t destsz);

比較:函數 strcat_s 與 BSD 函數 strlcat 相似,除以下情況: strlcat 截斷源字符串以適合目標 strlcat 不執行所有的運行時檢查是 strcat_s 不會 strlcat 通過將目標設置爲空字符串或在調用失敗時調用處理程序不會使失敗變得明顯。
雖然 strcat_s 由於潛在的安全風險而禁止截斷,但可以使用 bounds-checked strncat_s 來截斷字符串。

原文鏈接 https://blog.csdn.net/ALPS233/article/details/102736487
參考:C++ Reference,C 中文開發手冊等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章