網站首頁 編程語言 正文
?自己實現strcpy、strlen
strcpy的實現
思路:
通過指針訪問地址然后將要copy的文本逐一復制到目的地。
void my_strcpy(char* dest, char* src){ while (*src !='\0'){ *dest = *src; src++; dest++; } *dest = *src; } //自己實現strcpy int main(){ char arr1[]="$$$$$$$$$$"; char arr2[]="hello"; my_strcpy(arr1,arr2);//將arr的內容復制到arr1中 printf("%s\n",arr2); return 0; }
優化1:
在my_strcpy()函數中*dest和*src直接在表達式中自加,先試用后加所以使用后置++
void my_strcpy(char* dest, char* src){ while (*src !='\0'){ *dest++ = *src++; } *dest = *src; }
優化2:
在while循環中,因為最后的終止條件是賦值到了絕對0的時候停止循環。那么最后一次賦值就是賦值0。那我們直接可以將賦值作為我們的終止條件。
void my_strcpy(char* dest, char* src){ while (*dest++ = *src++); *dest = *src; }
優化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; } //自己實現strcpy int main(){ char arr1[]="$$$$$$$$$$"; char arr2[]="hello"; my_strcpy(arr1,NULL);//將arr的內容復制到arr1中 printf("%s\n",arr2); return 0; }
優化4:
在程序員將dest 和 src寫反的情況。我們應該怎么處理呢?
加const 使得我們的原來的數據不能被拷貝數據不能進行修改。從強制檢測。另一方面解釋:源頭的數據的安全性得到保證。
#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修飾的東西被限制。
優化5:
在官方提供的庫函數中strcpy是有返回值的。返回什么呢?我們應該返回copy執行完成之后的字符串中首字母的地址。但是我們發現之前已經在執行的過程中就將dest值修改了。又怎么辦呢?在刷算法題的時候有個經驗就是,在對地址進行操作之前先提前備份一份。然后將備份的這個地址位置返回即可。
#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. 分析參數的設計(命名,類型),返回值的情況。 2. 關于野指針問題,空指針的危害。 3. assert的使用方式和作用 4. 參數部分使用const,以及const的作用。 5. 注釋的重要性。
strlen的實現
#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; }
總結
原文鏈接:https://blog.csdn.net/Tian_baby/article/details/122355246
相關推薦
- 2022-06-02 C++的智能指針你真的了解嗎_C 語言
- 2022-11-20 C#設計模式之裝飾器模式實例詳解_C#教程
- 2022-05-21 云原生自動化應用于docker倉庫私有憑據secret創建_docker
- 2022-08-15 使用element中el-table設置type=“expand“展開行隱藏小箭頭的方法(列表單選、
- 2023-07-18 @Autowired在IDEA中報錯,如果修改呢?
- 2022-03-09 C++使用map實現多進程拷貝文件的程序思路_C 語言
- 2023-07-07 更新node后項目報錯
- 2022-03-17 Redis快速部署為Docker容器的實現方法_docker
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支