網站首頁 編程語言 正文
前言
用C語言模擬實現strlen函數,我這里有三種方法,快來看看跟你用的方法是否是一樣。
一.strlen函數的介紹
1.strlen函數的聲明
size_t strlen ( const char * str );
這里函數的返回值為無符號整形(size_t),傳入的是一個常量char*類型的指針。
2.strlen函數的簡單運用
用strlen函數可以求出字符串的長度
#include#include int main() { char str[] = "qwerty"; int ret = strlen(str); printf("字符串的長度 = %d\n", ret); return 0; }
代碼運行結果
3.注意事項
1.字符串是以?'\0' 作為結束標志,strlen函數返回的是在字符串中 '\0' 前面出現的字符個數(不包含 '\0' )。
2.參數指向的字符串必須要以 '\0' 結束。
如果不是以'\0'結束,輸出結果將是一個隨機值,例如:
#include#include int main() { char str[] = { 'a', 'b', 'c' };//這里沒有以'\0'結束 int ret = strlen(str); printf("字符串的長度 = %d\n", ret); return 0; }
代碼運行結果
?其實這個代碼的修改方法也很簡單,例如:
方法1
#include#include int main() { char str[] = { 'a', 'b', 'c', '\0'}; int ret = strlen(str); printf("字符串的長度 = %d\n", ret); return 0; }
方法2(如果一個數組沒存滿的話后面的值默認存0,而'\0'的ASCII碼值就是0)
#include#include int main() { char str[5] = { 'a', 'b', 'c'}; int ret = strlen(str); printf("字符串的長度 = %d\n", ret); return 0; }
代碼運行結果
3.注意函數的返回值為size_t,是無符號的整形( 易錯 )
#include#include int main() { if (strlen("abc") - strlen("abcdefg") > 0) { printf(">\n"); } else { printf("<=\n"); } return 0; }
運行結果
出現這個>符號的結果的原因就在于函數的返回值為size_t,是無符號的整形,兩個無符號整形的數字相減得到的還是一個無符號整形,雖然這兩個字符串長度相減得到的是-3,但是編譯器會把他當成無符號的整形,把-3當成無符號整形將會是一個很大的正整數,所以輸出的結果是>符號。(這是一個易錯點)
二.三種實現strlen函數的方法
三個方法的共同點:
1.都要用const修飾指針,因為傳址進來后只需要判斷這字符串的長度,并不需要修改字符串的值,所以要用const修飾,這樣使其更安全。
2.都要用assert斷言,斷言傳來的指針不能為空指針,因為空指針是不能被訪問的。
1.計數器的方法
這是最普通的方法,創建一個計數器變量,然后就開始找'\0',每經過一個字符,計數器就+1,直到找到'\0'為止。最后將計數器的值返回。
#include#include size_t my_strlen(const char* str) { assert(str != NULL);//判斷傳入的指針是否為空指針 int count = 0;//創建一個計數器變量,記錄字符串的長度 while (*str) //當找到'\0'的時候循環結束 { count++;//記錄字符串的長度 str++; } return count; } int main() { char str[] = "qwerty"; int ret = my_strlen(str); printf("%d", ret); return 0; }
2.遞歸方法
一時遞歸一時爽,一直遞歸一直爽。(講解全在注釋里面,嘻嘻)
#include#include size_t my_strlen(const char* str) { assert(str != NULL);//判斷傳入的指針是否為空指針 if (*str)//一直遞歸,直到找到'\0'為止 { str++; return (1 + my_strlen(str));//遞歸,并返回1+記錄字符串長度 } return 0; } int main() { char str[] = "qwerty"; int ret = my_strlen(str); printf("%d", ret); return 0; }
3.指針-指針的方法
我們都知道指針-指針的結果是他們之間元素的個數(因為這個我在指針初階篇將過,嘻嘻),這個方法就是利用這個原理來寫的。所以我們只用找到字符串首字符的地址和'\0'的地址,然后相減就可以得到字符串的長度了。
#include#include size_t my_strlen(const char* str) { assert(str != NULL);//判斷傳入的指針是否為空指針 const char* start = str;//創建一個存儲首字符地址的指針,注意也要用const修飾,保持類型一致 while (*str)//找'\0'的地址 { str++; } return (str - start);//指針('\0'的地址) - 指針(首字符的地址) = 中間字符的個數 } int main() { char str[] = "qwerty"; int ret = my_strlen(str); printf("字符串的長度 = %d\n", ret); return 0; }
三種方法的運行結果都是一樣的
原文鏈接:https://blog.csdn.net/qq_64042727/article/details/123620651
相關推薦
- 2022-12-04 Golang如何快速構建一個CLI小工具詳解_Golang
- 2022-06-16 python遺傳算法之單/多目標規劃問題_python
- 2023-07-10 匿名內部類、Lambda表達式、方法引用對比分析
- 2022-08-22 ?C++?new?和?delete?關鍵字詳解_C 語言
- 2022-01-21 面試題:說一說es6新增方法
- 2022-06-10 在vscode中快速新建html文件的2種方法總結_C 語言
- 2023-10-16 textarea文本編輯器改變字體顏色
- 2022-11-05 Nginx反向代理location和proxy_pass配置規則詳細總結_nginx
- 最近更新
-
- 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同步修改后的遠程分支