版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 課后延時(shí)輔導(dǎo)具體管理制度(3篇)
- 運(yùn)維場(chǎng)地安全管理制度(3篇)
- 餐飲乙醇安全使用管理制度(3篇)
- 獸藥廠家技術(shù)培訓(xùn)課件
- 2026年及未來(lái)5年市場(chǎng)數(shù)據(jù)中國(guó)在線自助游行業(yè)發(fā)展運(yùn)行現(xiàn)狀及發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告
- 《GAT 651-2021公安交通指揮系統(tǒng)工程建設(shè)通 用程序和要求》專題研究報(bào)告
- 中學(xué)教育教學(xué)資源配置制度
- 養(yǎng)老院入住老人醫(yī)療護(hù)理技能培訓(xùn)制度
- 養(yǎng)鴨培訓(xùn)課件
- 交通場(chǎng)站服務(wù)規(guī)范制度
- T-TBD 004-2024 土壤調(diào)理劑標(biāo)準(zhǔn)規(guī)范
- 塵埃粒子95%置信上限UCL計(jì)算公式
- 醫(yī)療質(zhì)量管理委員會(huì)職責(zé)制度
- 四川省綿陽(yáng)市2023-2024學(xué)年高一上學(xué)期期末檢測(cè)英語(yǔ)試題(解析版)
- 中醫(yī)內(nèi)科學(xué)智慧樹(shù)知到答案2024年浙江中醫(yī)藥大學(xué)
- NB-T31007-2011風(fēng)電場(chǎng)工程勘察設(shè)計(jì)收費(fèi)標(biāo)準(zhǔn)
- 2022版科學(xué)課程標(biāo)準(zhǔn)解讀-面向核心素養(yǎng)的科學(xué)教育(課件)
- 全球Web3技術(shù)產(chǎn)業(yè)生態(tài)發(fā)展報(bào)告(2022年)
- 福建省部分地市2024屆高三上學(xué)期第一次質(zhì)量檢測(cè)物理試卷(含答案)
- Q-SY 05673-2020 油氣管道滑坡災(zāi)害監(jiān)測(cè)規(guī)范
- 聯(lián)化科技(臨海)有限公司年產(chǎn)20萬(wàn)噸電解液、2萬(wàn)噸LT612、1411噸氫氧化鋰溶液、500噸三(三甲基硅基)磷酸酯等項(xiàng)目環(huán)評(píng)報(bào)告
評(píng)論
0/150
提交評(píng)論