C語(yǔ)言詳細(xì)講解strcpystrcatstrcmp函數(shù)的模擬實(shí)現(xiàn)_第1頁(yè)
C語(yǔ)言詳細(xì)講解strcpystrcatstrcmp函數(shù)的模擬實(shí)現(xiàn)_第2頁(yè)
C語(yǔ)言詳細(xì)講解strcpystrcatstrcmp函數(shù)的模擬實(shí)現(xiàn)_第3頁(yè)
C語(yǔ)言詳細(xì)講解strcpystrcatstrcmp函數(shù)的模擬實(shí)現(xiàn)_第4頁(yè)
C語(yǔ)言詳細(xì)講解strcpystrcatstrcmp函數(shù)的模擬實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第C語(yǔ)言詳細(xì)講解strcpystrcatstrcmp函數(shù)的模擬實(shí)現(xiàn)目錄一、模擬實(shí)現(xiàn)strcpy函數(shù)二、模擬實(shí)現(xiàn)strcat函數(shù)三、模擬實(shí)現(xiàn)strcmp函數(shù)四、小結(jié)

一、模擬實(shí)現(xiàn)strcpy函數(shù)

strcpy函數(shù)是字符串拷貝函數(shù),就是將源字符串拷貝到目標(biāo)空間中。

char*strcpy(char*destination,constchar*source);//庫(kù)函數(shù)中的聲明

將源(source)指向的c字符串復(fù)制到目標(biāo)(destination)指向的數(shù)組中,包括終止的空字符(并在該點(diǎn)停止)。

為避免溢出,目標(biāo)(destination)指向的數(shù)組的大小應(yīng)足夠長(zhǎng),以包含與源相同的C字符串(包括終止的空字符),并且在內(nèi)存中不應(yīng)與源重疊。

在這里需要注意:

1、源字符串必須以\0結(jié)束。

2、會(huì)將源字符串中的\0拷貝到目標(biāo)空間。

3、目標(biāo)空間必須足夠大,以確保能存放源字符串。

4、目標(biāo)空間必須可變。

下面就用my_strcpy來(lái)模擬實(shí)現(xiàn)stcpy函數(shù)。

#includestdio.h

#includeassert.h//assert的頭文件

char*my_strcpy(char*dest,constchar*src)//這里用const修飾所指向的源字符串,因?yàn)樵醋址?/p>

//常量字符串,不能被修改

char*ret=dest;

assert(dest);//斷言源字符串和目標(biāo)空間都不能為空指針

assert(src);

while(*dest++=*src++)//一個(gè)字符串一個(gè)字符串的拷貝,遇到'\0'結(jié)束

returnret;//返回目標(biāo)空間的起始地址

intmain()

chararr1[20]={0};

chararr2[]="hello";

printf("%s",my_strcnpy(arr1,arr2));

return0;

}

以上是整個(gè)字符串的拷貝,如果我們不拷貝整個(gè)字符串,只拷貝字符串里面的幾個(gè)字符,我們可以怎么做呢?接下來(lái)我們來(lái)看看strncpy這個(gè)函數(shù),這個(gè)函數(shù)可以實(shí)現(xiàn)只拷貝字符串里面的幾個(gè)字符。這個(gè)函數(shù)的模擬實(shí)現(xiàn)大體上跟strcpy函數(shù)是一樣的,只是這里有了長(zhǎng)度限制,接下來(lái)用my_strncpy來(lái)模擬實(shí)現(xiàn)。

#includestdio.h

#includeassert.h

char*my_strcnpy(char*dest,constchar*src,size_tn)

char*ret=dest;

assert(dest);

assert(src);

inti=0;

for(i=0;ii++)//要拷貝幾個(gè)字符,循環(huán)幾次

*dest++=*src++;

returnret;

intmain()

chararr1[20]={0};

chararr2[]="hello";

printf("%s",my_strcnpy(arr1,arr2,3));//3就是我們要拷貝的字符串的大小,這里就相當(dāng)于將前三個(gè)字符hel進(jìn)行拷貝(這里也可以將整個(gè)字符串拷貝,只要知道大小)

return0;

}

二、模擬實(shí)現(xiàn)strcat函數(shù)

strcat是連接字符串函數(shù),它的作用是將源字符串附加到目標(biāo)字符串。目標(biāo)中終止的空字符被源字符串中的第一個(gè)字符覆蓋,空字符包含在由目標(biāo)中的兩個(gè)字符串聯(lián)而成的新字符串的末尾。

char*strcat(char*destination,constchar*source);//庫(kù)函數(shù)中的聲明

在這里需要注意:

1、源字符串必須以\0結(jié)束,目的地也必須以\0結(jié)束

2、目標(biāo)空間必須有足夠的大,能容納下源字符串的內(nèi)容。

3、目標(biāo)空間必須可修改。

下面就用my_strcat來(lái)模擬實(shí)現(xiàn)strcat函數(shù)。

#includestdio.h

#includeassert.h

char*my_strcat(char*dest,constchar*src)這里用const修飾所指向的源字符串,因?yàn)樵醋址?/p>

//常量字符串,不能被修改

char*ret=dest;

assert(dest);

assert(src);

while(*dest!='\0')\\找到目標(biāo)空間的結(jié)束標(biāo)志處,然后開(kāi)始連接

dest++;

while(*dest++=*src++)

returnret;//返回目標(biāo)空間的起始地址

intmain()

chararr1[20]="abc";

chararr2[]="def";

printf("%s\n",my_strncat(arr1,arr2));

return0;

}

對(duì)于字符串連接還有一個(gè)函數(shù)strncat也能描述,但是這個(gè)函數(shù)是有長(zhǎng)度限制的,可以連接一個(gè)字符串里面的幾個(gè)字符或者整個(gè)字符串。下面就用my_strncat來(lái)模擬實(shí)現(xiàn)strcat函數(shù)。

#includestdio.h

#includeassert.h

char*my_strncat(char*dest,constchar*src,size_tn)

char*ret=dest;

assert(dest);

assert(src);

inti=0;

while(*dest!='\0')\\找到目標(biāo)空間的結(jié)束標(biāo)志處,然后開(kāi)始連接

dest++;

for(i=0;ii++)//要連接幾個(gè)字符,循環(huán)幾次

*dest++=*src++;

returnret;//返回目標(biāo)空間的起始地址

intmain()

chararr1[20]="abc";

chararr2[]="def";

printf("%s\n",my_strncat(arr1,arr2,2));//需要連接幾個(gè)字符串,就將它們的大小傳過(guò)去,這里這里的2就是字符串里面"de"的大小,將"de"兩個(gè)字符傳過(guò)去

return0;

}

三、模擬實(shí)現(xiàn)strcmp函數(shù)

strcmp是字符串比較函數(shù),比較兩個(gè)字符串str1和str2,此函數(shù)開(kāi)始比較每個(gè)字符串的第一個(gè)字符。如果它們彼此相等,則繼續(xù)往下比,直到字符不同或到達(dá)終止的空字符。

intstrcmp(constchar*str1,constchar*str2);//庫(kù)函數(shù)中的聲明

第一個(gè)字符串大于第二個(gè)字符串,則返回大于0的數(shù)字

第一個(gè)字符串等于第二個(gè)字符串,則返回0

第一個(gè)字符串小于第二個(gè)字符串,則返回小于0的數(shù)字

下面用my_strcmp來(lái)模擬實(shí)現(xiàn)strcmp函數(shù):

#includestdio.h

#includeassert.h

intmy_strcmp(constchar*str1,constchar*str2)

assert(str1);

assert(str2);

while(*str1==*str2)//先看首字符如果這兩個(gè)字符是否相等,如果相等繼續(xù)往下比,不相等跳出去比較大小

if(*str1=='\0')//判斷是否已經(jīng)比完了所有字符,如果已經(jīng)比完了返回0,說(shuō)明這兩個(gè)字符串相等

return0;

else//如果沒(méi)有比完,繼續(xù)往下一個(gè)比

str1++;

str2++;

//如果兩個(gè)字符不相等,那就比大小,返回大于0的數(shù)則說(shuō)明str1str2,反之小于。

return*str1-*str2;

intmain()

chararr1[20]="abcefg";

chararr2[]="efghij";

intret=my_strcmp(arr1,arr2);

if(ret0)

printf("大于\n");

elseif(ret0)

printf("小于\n");

else

printf("等于\n");

return0;

}

有長(zhǎng)度限制的比較函數(shù)strncmp,下面用my_strncmp模擬實(shí)現(xiàn):

#includestdio.h

#includeassert.h

intmy_strncmp(constchar*str1,constchar*str2,intn)

inti=0;

for(i=0;ii++)//需要比較幾個(gè)字符循環(huán)幾次

if(*(str1+i)==*(str2+i))//先看首字符如果這兩個(gè)字符是否相等,如果相等繼續(xù)往下比,不相等跳出去比較大小

if(*str1=='\0')//判斷是否已經(jīng)比完了所有字符,如果已經(jīng)比完了返回0,說(shuō)明這兩個(gè)字符串相等

return0;

else//如果沒(méi)有比完,繼續(xù)往下一個(gè)比

str1++;

str2++;

//如果兩個(gè)字符不相等,那就比大小,返回大于0的數(shù)則說(shuō)明str1str2,反之小于。

return*str1-*str2;

intmain()

chararr1[20]="abcefg";

chararr2[]="efghij";

intret=my_strncmp(arr1,arr2,2);

if

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論