strcpy,、memcpy和memset之間的區(qū)別strcpy比較簡(jiǎn)單,就是拷貝字符串,,遇到'\0'時(shí)結(jié)束拷貝,。 memcpy用來(lái)做內(nèi)存拷貝,可以拷貝任何數(shù)據(jù)類(lèi)型的對(duì)象并指定拷貝數(shù)據(jù)的長(zhǎng)度:char a[100],b[50]; memcpy(b, a, sizeof(b)); 總結(jié)一下: strcpy和memcpy主要有以下3方面的區(qū)別,。 //注意:如果用的是sizeof(a),則會(huì)造成內(nèi)存泄露。 比較復(fù)雜點(diǎn)的是memset,,用來(lái)對(duì)一段內(nèi)存空間全部設(shè)置為某個(gè)字符,,一般用在對(duì)定義的字符串進(jìn)行初始化為‘ ’或‘\0’,比如: char a[100];memset(a, '\0', sizeof(a)); 另外比較方便的是對(duì)結(jié)構(gòu)體的操作,, memset可以方便的清空一個(gè)結(jié)構(gòu)類(lèi)型的變量或數(shù)組: 比如有結(jié)構(gòu)體struct sample_strcut stTest,,一般清空結(jié)構(gòu)體的話得用如下方式: struct sample_struct { char csName[16]; int iSeq; int iType; }; 而如果用memset就非常方便了: memset(&stTest,0,sizeof(struct sample_struct)); 參考:http://www./junfeng568/archive/2006/03/11/4022.html http://blog./uid-23922099-id-3555928.html 今天遇到的筆試題是實(shí)現(xiàn)strcpy和memcpy,當(dāng)時(shí)沒(méi)做出來(lái),,網(wǎng)上一搜才發(fā)現(xiàn)是零幾年淘寶就出過(guò)的題目,,好吧。,。 參考:http://blog.sina.com.cn/s/blog_4d3a41f40100cvz8.html#cmt_1557675 char *strcpy(char *des, const char *src){
assert((des != NULL) && (src != NULL));//如果值為假,,打印輸出錯(cuò)誤 char *add = des; while ((*des++ = *src++ ) != ‘\0’) ;return add;
}
void *memcpy(void *pvTo, const void *pvFrom, size_t size) {
assert((pvTo != NULL) && (pvFrom != NULL)); // 使用斷言
byte *pbTo = (byte *) pvTo; // 防止改變pvTo的地址
byte *pbFrom = (byte *) pvFrom; // 防止改變pvFrom的地址
while(size -- > 0 ) *pbTo = *pbFrom ; return pvTo;
} 下面看筆試題的得分點(diǎn): char* strcpy(char* strDest,const char* strSrc)
{ if((strDest == NULL) || (strSrc == NULL)) //[1]
throw "Invalid Arguments"; //[2]
char* strDestCopy = strDest; //[3]
while((*strDest = *strSrc ) != '\0')//[4] ; return strDestCopy;
} [1] 參數(shù)檢查 在本例中char*轉(zhuǎn)換為bool即是類(lèi)型隱式轉(zhuǎn)換,,這種功能雖然靈活,但是更多的是導(dǎo)致出錯(cuò)概率的增大和維護(hù)成本的增高 會(huì)減少程序的可維護(hù)性,。0雖然簡(jiǎn)單,但程序中可能出現(xiàn)很多處對(duì)指針的檢查,,萬(wàn)一出現(xiàn)筆誤,,編譯器不能發(fā)現(xiàn),生成的程序內(nèi)含邏輯錯(cuò) 誤,,很難排除,。而使用NULL代替0,如果出現(xiàn)拼寫(xiě)錯(cuò)誤,,編譯器就會(huì)檢查出來(lái),。 [2] 返回值 返回函數(shù)體內(nèi)分配的內(nèi)存是十分危險(xiǎn)的做法,他把釋放內(nèi)存的義務(wù)拋給不知情的調(diào)用者,絕大多數(shù)情況下,,調(diào)用者不會(huì)釋放內(nèi)存,,這導(dǎo)致內(nèi)存泄露 值肩負(fù)返回正確值和異常值的雙重功能,,其結(jié)果往往是兩種功能都失效,。應(yīng)該以拋出異常來(lái)代替返回值,這樣可以減輕調(diào)用者的負(fù)擔(dān),、使錯(cuò)誤不會(huì)被忽略,、 增強(qiáng)程序的可維護(hù)性。 [3] 細(xì)節(jié) [4] 細(xì)節(jié) 最后,,為啥要返回char *? 返回strDest的原始值使函數(shù)能夠支持鏈?zhǔn)奖磉_(dá)式,,增加了函數(shù)的“附加值”。同樣功能的函數(shù),,如果能合理地提高的可用性,, 自然就更加理想。鏈?zhǔn)奖磉_(dá)式的形式如: int iLength=strlen(strcpy(strA,strB)); 其三,,為了保護(hù)源字符串,,形參用const限定strSrc所指的內(nèi)容,把const char *作為char *返回,,類(lèi)型不符,,編譯報(bào)錯(cuò)。 |
|
來(lái)自: 蘭寶888 > 《待分類(lèi)》