一篇文章教你如何用C語(yǔ)言實(shí)現(xiàn)strcpy和strlen
自己實(shí)現(xiàn)strcpy、strlen
strcpy的實(shí)現(xiàn)
思路:
通過(guò)指針訪問(wèn)地址然后將要copy的文本逐一復(fù)制到目的地。
void my_strcpy(char* dest, char* src){ while (*src !='\0'){ *dest = *src; src++; dest++; } *dest = *src; } //自己實(shí)現(xiàn)strcpy int main(){ char arr1[]="$$$$$$$$$$"; char arr2[]="hello"; my_strcpy(arr1,arr2);//將arr的內(nèi)容復(fù)制到arr1中 printf("%s\n",arr2); return 0; }
優(yōu)化1:
在my_strcpy()函數(shù)中*dest和*src直接在表達(dá)式中自加,先試用后加所以使用后置++
void my_strcpy(char* dest, char* src){ while (*src !='\0'){ *dest++ = *src++; } *dest = *src; }
優(yōu)化2:
在while循環(huán)中,因?yàn)樽詈蟮慕K止條件是賦值到了絕對(duì)0的時(shí)候停止循環(huán)。那么最后一次賦值就是賦值0。那我們直接可以將賦值作為我們的終止條件。
void my_strcpy(char* dest, char* src){ while (*dest++ = *src++); *dest = *src; }
優(yōu)化3:
如果傳入的是空指針我們應(yīng)該告訴這個(gè)輸入有問(wèn)題。
引入assert();斷言–>如果輸入錯(cuò)誤顯示錯(cuò)誤。 個(gè)人理解就像java,python中的異常處理。
#include <assert.h> void my_strcpy(char* dest, char* src){ assert(dest != NULL); assert(src != NULL); while (*dest++ = *src++); *dest = *src; } //自己實(shí)現(xiàn)strcpy int main(){ char arr1[]="$$$$$$$$$$"; char arr2[]="hello"; my_strcpy(arr1,NULL);//將arr的內(nèi)容復(fù)制到arr1中 printf("%s\n",arr2); return 0; }
優(yōu)化4:
在程序員將dest 和 src寫反的情況。我們應(yīng)該怎么處理呢?
加const 使得我們的原來(lái)的數(shù)據(jù)不能被拷貝數(shù)據(jù)不能進(jìn)行修改。從強(qiáng)制檢測(cè)。另一方面解釋:源頭的數(shù)據(jù)的安全性得到保證。
#include <assert.h> void my_strcpy(char* dest,const char* src){ assert(dest != NULL); assert(src != NULL); while (*dest++ = *src++); //這里寫反的話將不能進(jìn)行賦值 因?yàn)閏 *dest = *src; }
對(duì)于const的講解
const int* p = # int* const p = # const int* const p = #
在第一行中:即const 放在指針變量* 的左邊的時(shí)候修飾的是*p 也就是說(shuō)也就是說(shuō)不能通過(guò)*p來(lái)改變*p(num )的值。
在第二行中:即const放在指針變量* 的右邊的時(shí)候修飾的是指針本身p,p不能被改變。
在第三行中:兩邊都進(jìn)行const修飾,p與*p都不能改變了。
我的理解:const只能修飾關(guān)鍵字本身右邊的第一個(gè)東西(像int*就直接理解為指針)。const修飾的東西被限制。
優(yōu)化5:
在官方提供的庫(kù)函數(shù)中strcpy是有返回值的。返回什么呢?我們應(yīng)該返回copy執(zhí)行完成之后的字符串中首字母的地址。但是我們發(fā)現(xiàn)之前已經(jīng)在執(zhí)行的過(guò)程中就將dest值修改了。又怎么辦呢?在刷算法題的時(shí)候有個(gè)經(jīng)驗(yàn)就是,在對(duì)地址進(jìn)行操作之前先提前備份一份。然后將備份的這個(gè)地址位置返回即可。
#include <assert.h> char* my_strcpy(char* dest,const char* src){ char* res = dest; assert(dest != NULL); assert(src != NULL); while (*dest++ = *src++); *dest = *src;//將'\0'進(jìn)行賦值。 return res; } #include <assert.h> char* my_strcpy(char* dest,const char* src){ char* res = dest; assert(dest != NULL); assert(src != NULL); while (*dest++ = *src++); *dest = *src;//將'\0'進(jìn)行賦值。 return res; }
總結(jié):
1. 分析參數(shù)的設(shè)計(jì)(命名,類型),返回值的情況。 2. 關(guān)于野指針問(wèn)題,空指針的危害。 3. assert的使用方式和作用 4. 參數(shù)部分使用const,以及const的作用。 5. 注釋的重要性。
strlen的實(shí)現(xiàn)
#include <assert.h> int my_strlen(const char* str){//不希望我的字符串被修改。 int count = 0; assert(str != NULL);//用來(lái)保證指針的有效性 while(*str !='\0'){ count++; str++; } return count; } int main(){ char arr[] = "abcdef"; int len = my_strlen(arr); printf("%d\n",len); return 0; }
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
- C語(yǔ)言strlen,strcpy,strcmp,strcat,strstr字符串操作函數(shù)實(shí)現(xiàn)
- C語(yǔ)言之sizeof與strlen的使用及區(qū)別
- C語(yǔ)言數(shù)組長(zhǎng)度的計(jì)算方法實(shí)例總結(jié)(sizeof與strlen)
- 淺談C語(yǔ)言中的sizeof()和strlen()的區(qū)別
- C語(yǔ)言strlen函數(shù)實(shí)現(xiàn)讀取字符串長(zhǎng)度詳解
- C語(yǔ)言sizeof和strlen的指針和數(shù)組面試題詳解
- C語(yǔ)言?模擬實(shí)現(xiàn)strlen函數(shù)詳解
- C語(yǔ)言基礎(chǔ) strlen 函數(shù)
- C語(yǔ)言strlen函數(shù)全方位講解
相關(guān)文章
Linux環(huán)境g++編譯GDAL動(dòng)態(tài)庫(kù)操作方法
下面小編就為大家?guī)?lái)一篇Linux環(huán)境g++編譯GDAL動(dòng)態(tài)庫(kù)操作方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05C語(yǔ)言基于EasyX實(shí)現(xiàn)貪吃蛇
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言基于EasyX實(shí)現(xiàn)貪吃蛇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06C++?IO設(shè)備讀寫功能實(shí)現(xiàn)詳解
C++的文件IO(Input,Output)操作就是指對(duì)文件進(jìn)行讀寫(輸入與輸出)的操作。輸入就是從磁盤上的文件中讀取內(nèi)容到內(nèi)存中。輸出就是將內(nèi)存中的數(shù)據(jù)內(nèi)容輸出或者說(shuō)寫入到磁盤的文件中,這篇文章主要介紹了C++?IO設(shè)備讀寫功能實(shí)現(xiàn)2022-11-11C語(yǔ)言創(chuàng)建鏈表錯(cuò)誤之通過(guò)指針參數(shù)申請(qǐng)動(dòng)態(tài)內(nèi)存實(shí)例分析
這篇文章主要介紹了C語(yǔ)言創(chuàng)建鏈表錯(cuò)誤之通過(guò)指針參數(shù)申請(qǐng)動(dòng)態(tài)內(nèi)存,是鏈表創(chuàng)建過(guò)程中非常常見(jiàn)的經(jīng)典錯(cuò)誤。實(shí)例中做了較為詳盡的分析,需要的朋友可以參考下2014-09-09