C/C++編程筆記:strcpy和strncpy使用的不安全性!差異詳解

所述的strcpy()函數是用來複制源串到目的字符串。若是dest字符串的緩衝區大小大於src字符串,則將src字符串複製到帶有終止NULL字符的dest字符串。可是,若是dest緩衝區較小,則使用src,而後它將複製內容而不會終止NULL字符。字符串可能不會重疊,而且目標字符串必須足夠大才能接收副本。編程

句法:數組

char * strcpy(char * dest,const char * src)微信

參數:該函數接受上述和如下描述的兩個參數:函數

src:將被複制的字符串。學習

dest:指向要在其中複製內容的目標數組的指針。spa

返回值:返回指向目標字符串的指針。指針

示例:視頻

輸出:blog

複製的字符串:ABC教程

strcpy()的問題: strcpy()函數未指定目標數組的大小,所以緩衝區溢出常常有風險。使用strcpy()函數將較大的字符數組複製到較小的字符數組是很危險的,可是若是字符串適合,那麼就不值得冒險了。若是目標字符串的大小不足以存儲源字符串,則未指定或未定義strcpy()的行爲。

輸出:ABC

strncpy()函數

strncpy()函數相似於strcpy()函數,不一樣之處在於最多複製了src個n字節。若是src的前n個字符中沒有NULL字符,則放置在dest中的字符串將不會以NULL終止。若是src的長度小於n,則strncpy()將另外的NULL字符寫入dest以確保總共寫入了n個字符。

句法:

char * strncpy(char * dest,const char * src,size_t n)

參數:該函數接受上述和如下描述的兩個參數:

src:將被複制的字符串。

dest:指向要在其中複製內容的目標數組的指針。

n:從src複製到dest的前n個字符。

返回值:返回指向目標字符串的指針。

例子:

輸出:

複製的字符串:ABCD

strncpy()的問題:若是src的前n個字符中沒有空字符,則放置在dest中的字符串將不會以空字符結尾。所以,strncpy()不保證目標字符串將以NULL終止。未終止的strlen()字符串可能致使段錯誤。換句話說,C / C ++中的非終止字符串只是一個定時炸彈,正等待破壞代碼。

輸出:

複製的字符串:geeksfor目標字符串的長度:8

如今,下一個問題是,是否有任何函數能夠保證目標字符串將以NULL終止而且沒有緩衝區溢出的機會?

所以,以上問題的答案爲「是」,「 stdio.h」庫中有幾個函數可確保知足以上條件。

snprintf

strlcpy

這兩個函數都保證目標字符串將以NULL終止。相似地,snprintf()函數,strlcpy函數最多將dest_size-1個字符(dest_size是目標字符串緩衝區的大小)從src複製到dst,並在必要時截斷src。結果始終爲空終止。該函數返回strlen(src)。緩衝區溢出能夠按如下方式檢查:

若是(strlcpy(dst,src,dstsize)> = dest_size)

        返回-1;

根據理智程度對功能進行排名:

strcpy <strncpy <snprintf <strlcpy

天天學點小知識,但願對你有幫助~

另外若是你想更好的提高你的編程能力,學好C語言C++編程!彎道超車,快人一步!筆者這裏或許能夠幫到你~

C語言C++編程學習交流圈子,QQ羣464501141點擊進入】微信公衆號:C語言編程學習基地

分享(源碼、項目實戰視頻、項目筆記,基礎入門教程)

歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比本身琢磨更快哦!

編程學習書籍分享:

編程學習視頻分享:

 

相關文章
相關標籤/搜索