androidstudio新建沒(méi)有src文件夾 VC 6.0的C語(yǔ)言庫(kù)函數(shù)的源代碼可以在哪找到?
VC 6.0的C語(yǔ)言庫(kù)函數(shù)的源代碼可以在哪找到?有安裝vs2008或2010嗎,在按裝目錄下面的VC/src中自帶有源代碼。比如說(shuō)我的就在D:ProgramFilesMicrosoft Visual
VC 6.0的C語(yǔ)言庫(kù)函數(shù)的源代碼可以在哪找到?
有安裝vs2008或2010嗎,在按裝目錄下面的VC/src中自帶有源代碼。比如說(shuō)我的就在
D:ProgramFilesMicrosoft Visual Studio10.0VCcrtsrc中。沒(méi)有的話郵箱你
strcpy函數(shù)怎么用?
一、在用步驟如下
1、頭文件:#includeltstring.hgt和#includeltstdio.hgt
2、功能:把從src地址就開(kāi)始且含有什么NULL已經(jīng)結(jié)束符的字符串復(fù)制到以dest就開(kāi)始的地址空間
3、說(shuō)明:src和dest所指內(nèi)存區(qū)域應(yīng)該不能交錯(cuò)重疊且dest必須有足夠的空間來(lái)吸納src的字符串。前往打向dest的指針。
二、拓寬思維
//C語(yǔ)言標(biāo)準(zhǔn)庫(kù)函數(shù)strcpy的一種是是的工業(yè)級(jí)的最簡(jiǎn)利用。
//返回值:目標(biāo)串的地址。
//參數(shù):des為目標(biāo)字符串,source為原字符串。
char*strcpy(char*des,constchar*source){
char*rdes
assert((des!NULL)ampamp(source!NULL))
while((*r*source)!#390#39)
returndes
}
//while((*des*source))的解釋?zhuān)嘿x值表達(dá)式直接返回左操作數(shù),因?yàn)樵谫x值#390#39后,循環(huán)再繼續(xù)。
舉例說(shuō)明:
chara[10],b[]{#34COPY#34}
//定義字符數(shù)組a,b
strcpy(a,b)
//將b中的copy復(fù)制到a中
Strcpy函數(shù)中的緩沖區(qū)溢出問(wèn)題和防范
C語(yǔ)言和C語(yǔ)言風(fēng)格快速、靈活自如,語(yǔ)法限制偏寬松,致使被三千多種程序員的歡迎,是比較好可以修的編程語(yǔ)言,另外又是各大院校計(jì)算機(jī)專(zhuān)業(yè)的基本上語(yǔ)言課程。strcpy函數(shù)因此不對(duì)數(shù)組邊界并且檢查,而太很難會(huì)造成各種緩沖區(qū)溢出的漏洞。這些漏洞很難被利用,而倒致嚴(yán)重的系統(tǒng)問(wèn)題。在建議使用strcpy函數(shù)時(shí),要謹(jǐn)慎。以下就Strcpy函數(shù)中的緩沖區(qū)溢出問(wèn)題和防范進(jìn)行討論。
VC 6.0的C語(yǔ)言庫(kù)函數(shù)的源代碼可以在哪找到?
棧溢出問(wèn)題
緩沖區(qū)的逸出是程序在代碼分配的緩沖區(qū)中寫(xiě)入了太大的數(shù)據(jù),使這個(gè)分配區(qū)突然發(fā)生了瀉出。一旦一個(gè)緩沖區(qū)借用程序能將正常運(yùn)行的指令放在有root權(quán)限的內(nèi)存中,啟動(dòng)這些指令,就這個(gè)可以依靠root權(quán)限來(lái)控制計(jì)算機(jī)了。
VC 6.0的C語(yǔ)言庫(kù)函數(shù)的源代碼可以在哪找到?
Strcpy函數(shù)的安全編碼
在編程時(shí),組建出現(xiàn)了錯(cuò)誤檢查,就可及時(shí)排查錯(cuò)誤,因此對(duì)直接出現(xiàn)的無(wú)比進(jìn)行處理。在c語(yǔ)言設(shè)計(jì)strcpy函數(shù)時(shí),必須盡量使目的緩沖區(qū)長(zhǎng)度相當(dāng)長(zhǎng),同時(shí)要先檢測(cè)目的緩沖區(qū)和源緩沖區(qū)。如果目的緩沖區(qū)或源緩沖區(qū)是空,也要在異常處理中都結(jié)束了程序。假如,源字符串比目的緩沖區(qū)長(zhǎng)度不長(zhǎng),也要在異常處理中結(jié)束后程序,以能夠防止直接出現(xiàn)溢出情況。任何程序都很很難說(shuō)是絕對(duì)方便,沒(méi)法以盡很有可能安全的來(lái)全面處理strcpy函數(shù)。只需然后輸入的字符串不以空字符結(jié)束了,函數(shù)可能會(huì)時(shí)刻中止。這種檢測(cè)容易實(shí)現(xiàn)程序。只不過(guò)這樣的檢測(cè)也并又不能可以確定函數(shù)一定會(huì)安全。
VC 6.0的C語(yǔ)言庫(kù)函數(shù)的源代碼可以在哪找到?
另外,每添加一個(gè)出現(xiàn)錯(cuò)誤檢查,變會(huì)使程序更緊張,不過(guò)可能會(huì)出現(xiàn)很多的bug,增加很多的工作量。最最重要的是,即使設(shè)計(jì)程序時(shí)非常細(xì)細(xì)的看,也有可能會(huì)選擇性的遺忘一些細(xì)節(jié)問(wèn)題,可能導(dǎo)致不可修補(bǔ)的錯(cuò)誤。所以我,在編寫(xiě)程序時(shí),最方便的方法,應(yīng)該是盡很可能不去不使用sprintf函數(shù)??梢栽诔绦虻拈_(kāi)頭算上#definestrcpyUnsafe_strcpy。這樣,可能會(huì)使strcpy函數(shù)在編譯時(shí)出現(xiàn)錯(cuò)誤,使使我們?cè)诰幊虝r(shí)可以全部掘棄strncpy函數(shù)。在幾乎扔掉strcpy函數(shù)的同時(shí),也就丟回了數(shù)千聽(tīng)命于于strcpy函數(shù)的bug。
VC 6.0的C語(yǔ)言庫(kù)函數(shù)的源代碼可以在哪找到?
特殊例子只能說(shuō)明
已知strcpy函數(shù)的原型是:
char*strcpy(char*strDest,constchar*strSrc)
1.不調(diào)用庫(kù)函數(shù),實(shí)現(xiàn)程序strcpy函數(shù)。
2.解釋為么要返回char*。
不調(diào)用庫(kù)函數(shù)要如何實(shí)現(xiàn)方法strncpy函數(shù)
strcpy的實(shí)現(xiàn)代碼
char*strcpy(char*strDest,constchar*strSrc){
if((NULLstrDest)||(NULLstrSrc))
//
VC 6.0的C語(yǔ)言庫(kù)函數(shù)的源代碼可以在哪找到?
throw#34Invalidargument(s)#34
//
strcpy函數(shù)怎么用?
char*strDestCopystrDest
//:
while((*strDest*strSrc)!#390#39)
//[4]
returnstrDestCopy
}
出現(xiàn)錯(cuò)誤的做法
VC 6.0的C語(yǔ)言庫(kù)函數(shù)的源代碼可以在哪找到?
:(A)不檢查指針的有效性,只能說(shuō)明答題者不特別注重代碼的健壯性。
(B)檢查指針的有效性時(shí)在用((!strDest)||(!strSrc))或(!(strDestampampstrSrc)),那就證明答題者對(duì)C語(yǔ)言中類(lèi)型的隱式轉(zhuǎn)換沒(méi)有深刻認(rèn)識(shí)。在本例中char*轉(zhuǎn)換為bool即是類(lèi)型隱式轉(zhuǎn)換的,這種功能雖然身形靈活,但許多的是會(huì)造成程序出錯(cuò)概率會(huì)增大和日常維護(hù)成本升高。所以C拿來(lái)增加了bool、true、false三個(gè)關(guān)鍵字以提供給更安全的的條件表達(dá)式。
(C)檢查指針的有效性時(shí)不使用((strDest0)||(strSrc0)),只能證明答題者可不知道在用常量的好處。再建議使用字面常量(如本例中的0)會(huì)增加程序的可維護(hù)性。0雖然簡(jiǎn)單點(diǎn),但程序中可能會(huì)出現(xiàn)很多處對(duì)指針的檢查,萬(wàn)一出現(xiàn)筆誤,編譯器不能發(fā)現(xiàn),生成氣體的程序中含邏輯錯(cuò)誤,沒(méi)法可以排除。而在用NULL不用0,如果沒(méi)有會(huì)出現(xiàn)拼寫(xiě)錯(cuò)誤,編譯器就會(huì)去檢查進(jìn)去。
出現(xiàn)了錯(cuò)誤的做法
strcpy函數(shù)怎么用?
:(A)returnnextstring(#34Invalidargument(s)#34);,那說(shuō)明答題者根本真不知道返回值的用途,而且他對(duì)內(nèi)存泄漏也沒(méi)有警惕心。從函數(shù)中返回函數(shù)體內(nèi)分配的內(nèi)存是非常什么危險(xiǎn)的做法,他把施放內(nèi)存的義務(wù)拋給不知情地的內(nèi)部函數(shù)者,絕大多數(shù)情況下,全局函數(shù)者不可能釋放內(nèi)存,這會(huì)造成內(nèi)存泄漏。
(B)return0;,那說(shuō)明答題者也沒(méi)能夠掌握異常機(jī)制。全局函數(shù)者有可能不記得檢查返回值,動(dòng)態(tài)創(chuàng)建者還可能根本無(wú)法檢查一下返回值(見(jiàn)后面的鏈?zhǔn)奖磉_(dá)式)。妄想讓返回值身肩趕往對(duì)的值和異樣值的加持功能,其結(jié)果來(lái)講是兩種功能都失去效果。估計(jì)以一拋異常來(lái)不用返回值,這樣可以不緩輕全局函數(shù)者的負(fù)擔(dān)、使出錯(cuò)絕對(duì)不會(huì)被看出、增加程序的可維護(hù)性。
錯(cuò)誤`的做法::
(A)忘存放原始的strDest值,那就證明答題者邏輯思維不防范嚴(yán)密。
出現(xiàn)錯(cuò)誤的做法[4]:
(A)循環(huán)可以寫(xiě)成while(*strDestCopy*strSrc);,同
VC 6.0的C語(yǔ)言庫(kù)函數(shù)的源代碼可以在哪找到?
(B)。(B)循環(huán)不能寫(xiě)while(*strSrc!#390#39)*strDest*strSrc;,只能說(shuō)明答題者對(duì)邊界條件的檢查領(lǐng)導(dǎo)不力。循環(huán)體結(jié)束了后,strDest字符串的末尾還沒(méi)有錯(cuò)誤的地另外#390#39。
講解為什么要回char*
返回strDest的原始值使函數(shù)也能意見(jiàn)鏈?zhǔn)奖磉_(dá)式,增強(qiáng)了函數(shù)的“附加值”。雖然功能的函數(shù),假如能合不合理地能提高的可用性,肯定就非常理想。
鏈?zhǔn)奖磉_(dá)式的形式如:
intiLengthstrlen(strcpy(strA,strB))
又如:
char*strAstrcpy(funchar[10],strB)
前往strSrc的上古時(shí)代值是出現(xiàn)了錯(cuò)誤的。其一,源字符串當(dāng)然是.設(shè)的,趕往它沒(méi)有意義。其二,又不能意見(jiàn)似龍第二例的表達(dá)式。其三,是為保護(hù)源字符串,形參用const限定strSrc所指的內(nèi)容,把constchar*才是char*回,類(lèi)型不符,程序編譯報(bào)錯(cuò)。
在上面的語(yǔ)句中,循環(huán)語(yǔ)句
while((*strDestCopy*strSrc)!#390#39)
較為容易解釋?zhuān)梢圆话堰@句理解為以下操作。
第一種:
while(1){
chartemp
*strDestCopy*strSrc
temp*strSrc
strDestCopy
strSrc
if(#390#39temp)
break
}
第二種:
while(*strSrc!#390#39){
*strDestCopy*strSrc
strDestCopy
strSrc
}
*strDestCopy*strSrc
也即:
while(*strSrc!#390#39){
*strDestCopy*strSrc
}
*strDestCopy‘0'
不使用實(shí)例
//實(shí)例1:將一個(gè)字符串拷備到一個(gè)起碼長(zhǎng)的字符數(shù)組中。本例中字符數(shù)組為a,長(zhǎng)度為20。
//缺點(diǎn):若數(shù)組長(zhǎng)度足于空間內(nèi)整個(gè)字符串,則程序運(yùn)行崩散。
#includeltiostreamgt
#includeltstdlib.hgt
usingnamespacestd
char*strcpy(char*strDest,constchar*strSrc){
char*strDestCopystrDest
if((NULLstrDest)||(NULLstrSrc))throw#34Invalidargument#34
while((*strDest*strSrc)!#390#39)
returnstrDestCopy
}
intmain(intargc,char*argv[]){
chara[20],c[]#34i amteacher!#34
try{
strcpy(a,c)
}catch(char*strInfo){
qdebugltltstrInfoltltendl
exit(-1)
}
qdebugltltaltltendl
return0
}
//實(shí)例2:預(yù)設(shè)兩個(gè)字符指針,一個(gè)指向字符串,那個(gè)為NULL,在程序運(yùn)行過(guò)程中拷入。
#includeltiostreamgt
usingnamespacestd
char*strcpy(char*strDes,constchar*strSrc)
//函數(shù)聲明
intmain(){
constchar*strSrc#34helloworld#34
char*strDesNULL
strDesstrcpy(strDes,strSrc)
coutltlt#34strSrc#34ltltstrSrcltltendl
coutltlt#34strDes#34ltltstrDesltltendl
if(strDes!NULL){
free(strDes)
strDesNULL
}
return0
}
char*strcpy(char*strDes,constchar*strSrc){
assert(strSrc!NULL)
//若strSrc為NULL,則丟出異常。
strDes(char*)malloc(strlen(strSrc)1)
//多一個(gè)空間用處存儲(chǔ)字符串結(jié)束了符#390#39
char*pstrDes
while(*strSrc!#390#39){
*p*strSrc
}
*p#390#39
returnstrDes
}
還有一個(gè)一種模擬算法:
char*strcpy(char*dest,constchar*src){
char*pdest
while(*src!#390#39){
*dest*src
destsrc
}
*dest#390#39
returnp
}
與strncpy的區(qū)別
第一種情況:
char*p#34whatare you?#34
charname[20]#34ABCDEFGHIJKLMNOPQRS#34
strcpy(name,p)
//name改變?yōu)?34whatare you?#34dstrok正確的!
strncpy(name,p,sizeof(name))
//name變動(dòng)為#34what'sare you?#34dstrok對(duì)的!現(xiàn)的字符將置為NULL
第二種情況:
char*p#34knoware you?#34
charname[10]
strcpy(name,p)
//目標(biāo)串長(zhǎng)度小于源串,錯(cuò)誤!
name[sizeof(name)-1]#390#39
//和上一退配對(duì)組合,增強(qiáng)結(jié)果,但這種做法并不可取,畢竟上踏上一步程序出錯(cuò)處理并不確認(rèn)
strncpy(name,p,sizeof(name))
//源串長(zhǎng)度大于0指定拷備的長(zhǎng)度sizeof(name),特別注意在這種下絕對(duì)不會(huì)自動(dòng)啟動(dòng)在目標(biāo)串后面加#390#39
name[sizeof(name)-1]#390#39