久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

strcpy,、memcpy和memset之間的區(qū)別

 蘭寶888 2019-07-11

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ū)別,。
            復(fù)制的內(nèi)容不同,。strcpy只能復(fù)制字符串,而memcpy可以復(fù)制任意內(nèi)容,,例如字符數(shù)組,、整型、結(jié)構(gòu)體,、類(lèi)等,。
            復(fù)制的方法不同,。strcpy不需要指定長(zhǎng)度,它遇到字符串結(jié)束符"\0"便結(jié)束,。memcpy則是根據(jù)其第3個(gè)參數(shù)決定復(fù)制的長(zhǎng)度,。
            用途不同。通常在復(fù)制字符串時(shí)用strcpy,,而需要復(fù)制其他類(lèi)型數(shù)據(jù)時(shí)則一般用memcpy,。

                 //注意:如果用的是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)體的話得用如下方式:

復(fù)制代碼

struct sample_struct
{ char   csName[16]; int    iSeq; int    iType;
};


stTest.csName[0]='\0';
stTest.iSeq=0;
stTest.iType=0;

復(fù)制代碼

  而如果用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

復(fù)制代碼

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;
}

復(fù)制代碼

 下面看筆試題的得分點(diǎn):

復(fù)制代碼

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;
}

復(fù)制代碼

 [1] 參數(shù)檢查
    (A)不檢查指針的有效性,說(shuō)明設(shè)計(jì)者不注重程序的健壯性
   (B)檢查指針的有效性時(shí)使用((!strDest) || (!strSrc))或(!(strDest && strSrc)),說(shuō)明對(duì)C語(yǔ)言中類(lèi)型隱式轉(zhuǎn)換沒(méi)有深刻認(rèn)識(shí),,

在本例中char*轉(zhuǎn)換為bool即是類(lèi)型隱式轉(zhuǎn)換,,這種功能雖然靈活,但是更多的是導(dǎo)致出錯(cuò)概率的增大和維護(hù)成本的增高
   (C)檢查指針的有效性時(shí)使用((strDest==0)||(strSrc==0))說(shuō)明答題者不知道使用常量的好處,。直接使用字面常量(如本例中的0)

會(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] 返回值
(A)return new string("Invalid arguments");,說(shuō)明答題者根本不知道返回值得用途,,并且它對(duì)內(nèi)存泄露也沒(méi)有警惕心,,從函數(shù)體中

返回函數(shù)體內(nèi)分配的內(nèi)存是十分危險(xiǎn)的做法,他把釋放內(nèi)存的義務(wù)拋給不知情的調(diào)用者,絕大多數(shù)情況下,,調(diào)用者不會(huì)釋放內(nèi)存,,這導(dǎo)致內(nèi)存泄露
(B)return 0;,說(shuō)明答題者沒(méi)有掌握異常機(jī)制,。調(diào)用者有可能忘記檢查返回值,,調(diào)用者還可能無(wú)法檢查返回值(見(jiàn)后面的鏈?zhǔn)奖磉_(dá)式)。妄想讓返回

值肩負(fù)返回正確值和異常值的雙重功能,,其結(jié)果往往是兩種功能都失效,。應(yīng)該以拋出異常來(lái)代替返回值,這樣可以減輕調(diào)用者的負(fù)擔(dān),、使錯(cuò)誤不會(huì)被忽略,、

增強(qiáng)程序的可維護(hù)性。

[3] 細(xì)節(jié)
(A)忘記保存原始的strDest值,,說(shuō)明答題者邏輯思維不嚴(yán)密,。

[4] 細(xì)節(jié)
(A)循環(huán)寫(xiě)成while (*strDest =*strSrc );,,同[1](B),。
(B)循環(huán)寫(xiě)成while (*strSrc!='\0') *strDest =*strSrc ;,說(shuō)明答題者對(duì)邊界條件的檢查不力,。循環(huán)體結(jié)束后,,strDest字符串的末尾沒(méi)有正確地加上'\0'。

最后,,為啥要返回char *?

返回strDest的原始值使函數(shù)能夠支持鏈?zhǔn)奖磉_(dá)式,,增加了函數(shù)的“附加值”。同樣功能的函數(shù),,如果能合理地提高的可用性,,

自然就更加理想。鏈?zhǔn)奖磉_(dá)式的形式如:

int iLength=strlen(strcpy(strA,strB));
又如:
char * strA=strcpy(new char[10],strB);
返回strSrc的原始值是錯(cuò)誤的,。其一,,源字符串肯定是已知的,返回它沒(méi)有意義,。其二,,不能支持形如第二例的表達(dá)式。

其三,,為了保護(hù)源字符串,,形參用const限定strSrc所指的內(nèi)容,把const char *作為char *返回,,類(lèi)型不符,,編譯報(bào)錯(cuò)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多