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

分享

strcpy函數(shù)與memcpy函數(shù)

 昵稱10788805 2013-05-02

strcpy和memcpy都是標(biāo)準(zhǔn)C庫(kù)函數(shù),它們有下面的特點(diǎn),。

strcpy提供了字符串的復(fù)制,。即strcpy只用于字符串復(fù)制,并且它不僅復(fù)制字符串內(nèi)容之外,,還會(huì)復(fù)制字符串的結(jié)束符,。

memcpy提供了一般內(nèi)存的復(fù)制。即memcpy對(duì)于需要復(fù)制的內(nèi)容沒(méi)有限制,,因此用途更廣,。

面試?yán)}5:編程實(shí)現(xiàn)strcpy函數(shù)。

考點(diǎn):字符串復(fù)制的實(shí)現(xiàn),。

出現(xiàn)頻率:★★★★

已知strcpy函數(shù)的原型是:

char * strcpy(char * strDest,const char * strSrc);

要求如下,。

(1)不調(diào)用庫(kù)函數(shù),,實(shí)現(xiàn)strcpy函數(shù);

(2)解釋為什么要返回char *,。

解析

程序代碼如下:

1    #include <stdio.h>
2
3    char * strcpy(char * strDest, const char * strSrc) // 實(shí)現(xiàn)strSrc到strDest的復(fù)制
4    {
5        if ((strDest == NULL) || (strSrc == NULL)) //判斷參數(shù)strDest和strSrc的有效性
6        {
7            return NULL;
8        }
9        char *strDestCopy = strDest;        //保存目標(biāo)字符串的首地址
10       while ((*strDest++ = *strSrc++)!='\0'); //把strSrc字符串的內(nèi)容復(fù)制到strDest下
11   
12       return strDestCopy;
13   }
14   
15   int getStrLen(const char *strSrc)         //實(shí)現(xiàn)獲取strSrc字符串的長(zhǎng)度
16   {
17       int len = 0; //保存長(zhǎng)度
18       while(*strSrc++ != '\0')             //循環(huán)直到遇見(jiàn)結(jié)束符'\0'為止
19       {
20           len++; 
21       }
22   
23       return len;
24   };
25   
26   int main()
27   {
28       char strSrc[] = "Hello World!";       //要被復(fù)制的源字符串
29       char strDest[20];                  //要復(fù)制到的目的字符數(shù)組
30       int len = 0;                       //保存目的字符數(shù)組中字符串的長(zhǎng)度
31       
32       len = getStrLen(strcpy(strDest, strSrc)); //鏈?zhǔn)奖磉_(dá)式,,先復(fù)制后計(jì)算長(zhǎng)度
33       printf("strDest: %s\n", strDest);
34       printf("Length of strDest: %d\n", len);
35   
36       return 0;
37   }

(1)strcpy函數(shù)的實(shí)現(xiàn)說(shuō)明。

代碼第5~第7行判斷傳入的參數(shù)strDest和strSrc是否為NULL,,如果是則返回NULL,。

代碼第9行把strDest的值保存到strDestCopy指針中。

代碼第10行對(duì)strSrc和strDest兩個(gè)指針進(jìn)行循環(huán)移動(dòng),,并不斷復(fù)制strSrc內(nèi)存的值到strDest內(nèi)存中,。

由于已經(jīng)保存了strDest指針的值,因此這里只需返回strDestCopy的值,,而函數(shù)調(diào)用完后返回的就是strDest的值,。

(2)strcpy函數(shù)返回char *類型的原因是為了能使用鏈?zhǔn)奖磉_(dá)式。首先調(diào)用strcpy使得strDest指針復(fù)制strSrc的內(nèi)存數(shù)據(jù),,然后調(diào)用getStrLen函數(shù)獲取strDest字符串的長(zhǎng)度,。這樣不僅調(diào)用方便,而且程序結(jié)構(gòu)簡(jiǎn)潔明了,。程序的輸出結(jié)果如下:

strDest: Hello World!
Length of strDest: 12

面試?yán)}6:編程實(shí)現(xiàn)memcpy函數(shù),。

考點(diǎn):內(nèi)存復(fù)制的實(shí)現(xiàn)。

出現(xiàn)頻率:★★★★

答案

程序代碼如下所示:

1    #include <stdio.h>
2    #include <assert.h>
3    
4    void *memcpy2(void *memTo, const void *memFrom, size_t size)
5    {
6        assert((memTo != NULL) && (memFrom != NULL)); //memTo和memFrom必須有效
7        char *tempFrom = (char *)memFrom;             //保存memFrom首地址
8        char *tempTo = (char *)memTo;                  //保存memTo首地址
9        
10       while(size -- > 0)                //循環(huán)size次,,復(fù)制memFrom的值到memTo中
11           *tempTo++ = *tempFrom++ ; 
12   
13       return memTo;
14   }
15   
16   int main()
17   {
18       char strSrc[] = "Hello World!";    //將被復(fù)制的字符數(shù)組
19       char strDest[20];               //目的字符數(shù)組
20       
21       memcpy2(strDest, strSrc, 4);    //復(fù)制strSrc的前4個(gè)字符到strDest中
22       strDest[4] = '\0';                //把strDest的第5個(gè)元素賦為結(jié)束符'\0'
23       printf("strDest: %s\n", strDest);
24   
25       return 0;
26   }

memcpy的實(shí)現(xiàn)如下,。

與strcpy不同,memcpy用參數(shù)size決定復(fù)制多少個(gè)字符(strcpy遇到結(jié)束符"\0"結(jié)束),。由于在主程序中只復(fù)制了strSrc的前4個(gè)字符(代碼第22行),,程序輸出如下:

strDest: Hell

面試?yán)}7:strcpy與memcpy的區(qū)別。

考點(diǎn):字符串復(fù)制與內(nèi)存復(fù)制之間的區(qū)別,。

出現(xiàn)頻率:★★★★

解析

strcpy和memcpy主要有以下3方面的區(qū)別,。

復(fù)制的內(nèi)容不同。strcpy只能復(fù)制字符串,,而memcpy可以復(fù)制任意內(nèi)容,,例如字符數(shù)組、整型,、結(jié)構(gòu)體,、類等。

復(fù)制的方法不同,。strcpy不需要指定長(zhǎng)度,,它遇到字符串結(jié)束符"\0"便結(jié)束。memcpy則是根據(jù)其第3個(gè)參數(shù)決定復(fù)制的長(zhǎng)度。

用途不同,。通常在復(fù)制字符串時(shí)用strcpy,,而需要復(fù)制其他類型數(shù)據(jù)時(shí)則一般用memcpy。

 

資料2:

strcpy函數(shù)的原型:
char *strcpy(char *strDest, const char *strSrc)
{
    assert((strDest != NULL) && (strSrc != NULL));
    char *address = strDest;
    while((*strDest++ = *strSrc++) != '\0')
        NULL;
    return address;
}
資料3:

已知strcpy函數(shù)的原型是
char* strcpy(char* strDest,const char* strSrc);
1.不調(diào)用庫(kù)函數(shù),,實(shí)現(xiàn)strcpy函數(shù)
2.解釋為什么要返回char*;

1.strcpy的實(shí)現(xià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;
}

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(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)論公約

    類似文章 更多