一篇文章教你如何用C語言實現(xiàn)strcpy和strlen
自己實現(xiàn)strcpy、strlen
strcpy的實現(xiàn)
思路:
通過指針訪問地址然后將要copy的文本逐一復制到目的地。
void my_strcpy(char* dest, char* src){
while (*src !='\0'){
*dest = *src;
src++;
dest++;
}
*dest = *src;
}
//自己實現(xiàn)strcpy
int main(){
char arr1[]="$$$$$$$$$$";
char arr2[]="hello";
my_strcpy(arr1,arr2);//將arr的內(nèi)容復制到arr1中
printf("%s\n",arr2);
return 0;
}
優(yōu)化1:
在my_strcpy()函數(shù)中*dest和*src直接在表達式中自加,先試用后加所以使用后置++
void my_strcpy(char* dest, char* src){
while (*src !='\0'){
*dest++ = *src++;
}
*dest = *src;
}
優(yōu)化2:
在while循環(huán)中,因為最后的終止條件是賦值到了絕對0的時候停止循環(huán)。那么最后一次賦值就是賦值0。那我們直接可以將賦值作為我們的終止條件。
void my_strcpy(char* dest, char* src){
while (*dest++ = *src++);
*dest = *src;
}
優(yōu)化3:
如果傳入的是空指針我們應該告訴這個輸入有問題。
引入assert();斷言–>如果輸入錯誤顯示錯誤。 個人理解就像java,python中的異常處理。
#include <assert.h>
void my_strcpy(char* dest, char* src){
assert(dest != NULL);
assert(src != NULL);
while (*dest++ = *src++);
*dest = *src;
}
//自己實現(xiàn)strcpy
int main(){
char arr1[]="$$$$$$$$$$";
char arr2[]="hello";
my_strcpy(arr1,NULL);//將arr的內(nèi)容復制到arr1中
printf("%s\n",arr2);
return 0;
}
優(yōu)化4:
在程序員將dest 和 src寫反的情況。我們應該怎么處理呢?
加const 使得我們的原來的數(shù)據(jù)不能被拷貝數(shù)據(jù)不能進行修改。從強制檢測。另一方面解釋:源頭的數(shù)據(jù)的安全性得到保證。
#include <assert.h>
void my_strcpy(char* dest,const char* src){
assert(dest != NULL);
assert(src != NULL);
while (*dest++ = *src++); //這里寫反的話將不能進行賦值 因為c
*dest = *src;
}
對于const的講解
const int* p = # int* const p = # const int* const p = #
在第一行中:即const 放在指針變量* 的左邊的時候修飾的是*p 也就是說也就是說不能通過*p來改變*p(num )的值。
在第二行中:即const放在指針變量* 的右邊的時候修飾的是指針本身p,p不能被改變。
在第三行中:兩邊都進行const修飾,p與*p都不能改變了。
我的理解:const只能修飾關鍵字本身右邊的第一個東西(像int*就直接理解為指針)。const修飾的東西被限制。
優(yōu)化5:
在官方提供的庫函數(shù)中strcpy是有返回值的。返回什么呢?我們應該返回copy執(zhí)行完成之后的字符串中首字母的地址。但是我們發(fā)現(xiàn)之前已經(jīng)在執(zhí)行的過程中就將dest值修改了。又怎么辦呢?在刷算法題的時候有個經(jīng)驗就是,在對地址進行操作之前先提前備份一份。然后將備份的這個地址位置返回即可。
#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'進行賦值。
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'進行賦值。
return res;
}
總結:
1. 分析參數(shù)的設計(命名,類型),返回值的情況。
2. 關于野指針問題,空指針的危害。
3. assert的使用方式和作用
4. 參數(shù)部分使用const,以及const的作用。
5. 注釋的重要性。
strlen的實現(xiàn)
#include <assert.h>
int my_strlen(const char* str){//不希望我的字符串被修改。
int count = 0;
assert(str != NULL);//用來保證指針的有效性
while(*str !='\0'){
count++;
str++;
}
return count;
}
int main(){
char arr[] = "abcdef";
int len = my_strlen(arr);
printf("%d\n",len);
return 0;
}
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!

