国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

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

2021-03-05 21:05 作者:C語言編程__Plus  | 我要投稿

所述的strcpy()函數(shù)是用來復(fù)制源串到目的字符串。如果dest字符串的緩沖區(qū)大小大于src字符串,則將src字符串復(fù)制到帶有終止NULL字符的dest字符串。但是,如果dest緩沖區(qū)較小,則使用src,然后它將復(fù)制內(nèi)容而不會(huì)終止NULL字符。字符串可能不會(huì)重疊,并且目標(biāo)字符串必須足夠大才能接收副本。


句法:

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

參數(shù):該函數(shù)接受上述和以下描述的兩個(gè)參數(shù):

src:將被復(fù)制的字符串。

dest:指向要在其中復(fù)制內(nèi)容的目標(biāo)數(shù)組的指針。

返回值:返回指向目標(biāo)字符串的指針。

示例:


輸出:

復(fù)制的字符串:ABC

strcpy()的問題:?strcpy()函數(shù)未指定目標(biāo)數(shù)組的大小,因此緩沖區(qū)溢出經(jīng)常有風(fēng)險(xiǎn)。使用strcpy()函數(shù)將較大的字符數(shù)組復(fù)制到較小的字符數(shù)組是很危險(xiǎn)的,但是如果字符串適合,那么就不值得冒險(xiǎn)了。如果目標(biāo)字符串的大小不足以存儲(chǔ)源字符串,則未指定或未定義strcpy()的行為。


輸出:ABC

strncpy()函數(shù)

strncpy()函數(shù)類似于strcpy()函數(shù),不同之處在于最多復(fù)制了src個(gè)n字節(jié)。如果src的前n個(gè)字符中沒有NULL字符,則放置在dest中的字符串將不會(huì)以NULL終止。如果src的長(zhǎng)度小于n,則strncpy()將另外的NULL字符寫入dest以確??偣矊懭肓薾個(gè)字符。

句法:

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

參數(shù):該函數(shù)接受上述和以下描述的兩個(gè)參數(shù):

src:將被復(fù)制的字符串。

dest:指向要在其中復(fù)制內(nèi)容的目標(biāo)數(shù)組的指針。

n:從src復(fù)制到dest的前n個(gè)字符。

返回值:返回指向目標(biāo)字符串的指針。

例子:


輸出:

復(fù)制的字符串:ABCD

strncpy()的問題:如果src的前n個(gè)字符中沒有空字符,則放置在dest中的字符串將不會(huì)以空字符結(jié)尾。因此,strncpy()不保證目標(biāo)字符串將以NULL終止。未終止的strlen()字符串可能導(dǎo)致段錯(cuò)誤。換句話說,C / C ++中的非終止字符串只是一個(gè)定時(shí)炸彈,正等待破壞代碼。


輸出:

復(fù)制的字符串:geeksfor目標(biāo)字符串的長(zhǎng)度:8

現(xiàn)在,下一個(gè)問題是,是否有任何函數(shù)可以保證目標(biāo)字符串將以NULL終止并且沒有緩沖區(qū)溢出的機(jī)會(huì)?

因此,以上問題的答案為“是”,“ stdio.h”庫(kù)中有幾個(gè)函數(shù)可確保滿足以上條件。

snprintf

strlcpy

這兩個(gè)函數(shù)都保證目標(biāo)字符串將以NULL終止。類似地,snprintf()函數(shù),strlcpy函數(shù)最多將dest_size-1個(gè)字符(dest_size是目標(biāo)字符串緩沖區(qū)的大?。膕rc復(fù)制到dst,并在必要時(shí)截?cái)鄐rc。結(jié)果始終為空終止。該函數(shù)返回strlen(src)。緩沖區(qū)溢出可以按以下方式檢查:

如果(strlcpy(dst,src,dstsize)> = dest_size)

? ? ? ? 返回-1;

根據(jù)理智程度對(duì)功能進(jìn)行排名:

strcpy <strncpy <snprintf <strlcpy

每天學(xué)點(diǎn)小知識(shí),希望對(duì)你有幫助~

另外如果你想更好的提升你的編程能力,學(xué)好C語言C++編程!彎道超車,快人一步!筆者這里或許可以幫到你~

分享(源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)

歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!



C/C++編程筆記:strcpy和strncpy使用的不安全性!差別詳解的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
博爱县| 成安县| 资中县| 澎湖县| 莆田市| 黄平县| 长沙市| 常熟市| 舒城县| 仪征市| 集安市| 东阳市| 灵璧县| 蓬莱市| 张北县| 丰原市| 永清县| 古田县| 恩施市| 吉安市| 开平市| 奎屯市| 色达县| 贵定县| 肃北| 成武县| 岚皋县| 来安县| 新和县| 如皋市| 洪湖市| 庆城县| 湘潭县| 彭山县| 玛沁县| 南宫市| 金坛市| 西贡区| 台东县| 万宁市| 邻水|