網站首頁 編程語言 正文
一.strlen函數模擬
字符串以‘\0’作為結束標志,strlen函數返回的是在字符串中‘\0’前面出現的字符個數(不包括‘\0’);
有三種方法可以實現該操作:
①計數器方式
②不能創建臨時變量計數器
③指針-指針
?方法一:計數器方式
int my_strlen(const char* str) { int count = 0;//定義count用來記錄字符串數組中字符數 while (*str) { count++; str++; } return count; }
方法二:不能創建臨時變量計數器
int my_strlen1(const char* str)//以遞歸的方式完成字符串長度函數的模擬 { if (*str == '\0') return 0; return 1 + my_strlen1(str + 1); }
方法三:指針-指針
指針相減得到的是兩個指針之間差距的元素個數,可以根據這種方式來實現strlen函數的模擬
int my_strlen2(char* s)//以此方式進行模擬時不能使用靜態const { char* p = s; while (*p != '\0') p++; return p - s; }
測試樣例
二. strcpy函數模擬
將src所指向的字符串包括‘\0’復制到dest所指向的字符串中
源字符串(src所指向的字符串)必須以‘\0’結束
目標空間需足夠大,以確保能存放源字符串
int main() { char s[10] = { 'a','b','c','d','e','f' }; char s1[10] = { 'c','c','b' }; printf("%s", my_strcpy(s, s1));//將s1中的字符復制到s空間中 return 0; } char* my_strcpy(char* dest, const char* src) { char* ret = dest; assert(dest != NULL);//斷言 assert(src != NULL);//斷言 while ((*dest++ = *src++)); return ret; }
測試結果?
最終將s2中以‘\0’為結束符的字符串復制到s中?
?三.strcat函數模擬
將src所指向的字符串包括‘\0’復制到dest所指向的字符串后面
源字符串必須以‘\0’結束
目標空間*dest需足夠大,以確保能夠存放源字符串(*src)
char* my_strcat(char* dest, const char* src) { char* ret = dest; assert(dest != NULL); assert(src != NULL); while (*dest)//訪問到dest所指向字符串的最后一個字符位置 { dest++; } while ((*dest++ = *src++));//將src指向的字符串復制到dest所指向字符串的后面 return ret; }
?測試樣例
將src指向的字符串復制到dest指向的字符串后面,最終得到結果
四.strcmp函數模擬
?strcmp函數的作用是比較字符串,用法如下strcmp(字符串1,字符串2),它會比較這兩個字符串:
如果字符串1等于字符串2,strcmp函數返回0;
如果字符串1小于字符串2,strcmp函數返回一個負值;
如果字符串1大于字符串2,strcmp函數返回一個正值.
?具體實現如下:
int my_strcmp(const char* dest, const char* src) { int ret = 0; assert(src != NULL); assert(dest != NULL); while (!(ret = *(unsigned char*)src - *(unsigned char*)dest) && *dest) { ++src; ++dest; } if (ret < 0) ret = -1; else if (ret > 0) ret = 1; return ret; }
總結
原文鏈接:https://blog.csdn.net/qq_58284486/article/details/122181599
相關推薦
- 2022-09-06 C語言常見排序算法歸并排序_C 語言
- 2022-04-10 Blazor框架簡介_基礎應用
- 2022-03-23 C++實現水仙花數判斷實例_C 語言
- 2023-11-21 linux sudo:/etc/sudoers 中第 11 行附近有解析錯誤 sudo:no val
- 2022-05-23 Go語言特點及基本數據類型使用詳解_Golang
- 2022-03-25 一篇文章讓你輕松理解C++中vector和list區別(c++中vector是什么)
- 2022-09-23 WPF仿微信實現截圖功能的方法詳解_C#教程
- 2022-09-13 C#?wpf使用ListBox實現尺子控件的示例代碼_C#教程
- 最近更新
-
- 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同步修改后的遠程分支