所述的strcpy()函式是用來復制源串到目的字串,如果dest字串的緩沖區大小大于src字串,則將src字串復制到帶有終止NULL字符的dest字串,但是,如果dest緩沖區較小,則使用src,然后它將復制內容而不會終止NULL字符,字串可能不會重疊,并且目標字串必須足夠大才能接收副本,
句法:
char * strcpy(char * dest,const char * src)
引數:該函式接受上述和以下描述的兩個引數:
src:將被復制的字串,
dest:指向要在其中復制內容的目標陣列的指標,
回傳值:回傳指向目標字串的指標,
示例:
輸出:
復制的字串: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語言編程學習基地
分享(原始碼、專案實戰視頻、專案筆記,基礎入門教程)
歡迎轉行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!
編程學習書籍分享:

編程學習視頻分享:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/266623.html
標籤:其他
