C語言編程之三個(gè)方法實(shí)現(xiàn)strlen函數(shù)
strlen()函數(shù)是來源于庫函數(shù)<string.h>
是用于計(jì)算字符串的長度,
且字符串需要以'\0'結(jié)尾
strlen()會(huì)計(jì)算'\0'前的字符個(gè)數(shù)。
根據(jù)MSDN的描述
size_t strlen(const char* string); size_t==unsigned int;
返回-無符號(hào)整型。
現(xiàn)在提供三種方法實(shí)現(xiàn)strlen()
一、計(jì)數(shù)器法
我們是計(jì)算字符個(gè)數(shù),可以設(shè)置一個(gè)變量,每找到一個(gè)字符,計(jì)數(shù)器就加一。
int my_strlen(const char* arr)//計(jì)數(shù)器的方法 { assert(arr); int count = 0; while (*arr)//條件是*arr!='\0',但'\0'也是數(shù)字0,且條件是0為假,非0為真 { count++; arr++; } return count; } int main(void) { char arr[] = "abcdef"; int len = my_strlen(arr); printf("len = %d\n", len); return 0; }
二、遞歸法
遞歸可以不創(chuàng)建變量去計(jì)算。
先看代碼吧
int my_strlen(const char* p)//遞歸法 { while (*p) { p++; my_strlen(p); return 1+my_strlen(p);//此時(shí)p已經(jīng)是進(jìn)入循環(huán)的p+1; } return 0; } int main(void) { char arr[] = "abcde"; int len = my_strlen(arr); printf("len = %d\n", len); return 0; }
傳了arr數(shù)組名進(jìn)去,用p來接收。同樣的判斷條件,進(jìn)入循環(huán)內(nèi),指針向右移動(dòng)了一個(gè)字節(jié),得到下一個(gè)字符的地址,又進(jìn)入函數(shù),再次循環(huán)
舉個(gè)例子
以字符串為ab為例
最后解引用得到‘\0',返回0。則上一級(jí)函數(shù)返回1+下一級(jí)函數(shù)的返回值(0),再返回上一級(jí)函數(shù),且他的返回值是1+1+0。正好是2
三,指針減指針法
指針相減,得到的不是指針,而是兩指針間的元素個(gè)數(shù)。
思路:我們找到首字符的指針,再找到‘\0'的指針,返回兩指針相減的值。
看代碼
int my_strlen(const char* p)//指針相減法 { char* ret = p; while (*p) { p++; } return p - ret; } int main(void) { char arr[] = "abcdef"; int len = my_strlen(arr); printf("len = %d\n", len); }
因?yàn)閜會(huì)不斷移動(dòng),指針指向的地址會(huì)改變,所以要先將首地址賦給另一個(gè)不會(huì)變化的指針。
這張圖就相當(dāng)明顯了。
代碼都可以運(yùn)行,所用編譯器為VS2019,記得運(yùn)行的時(shí)候加上頭文件
以上就是C語言編程之三個(gè)方法實(shí)現(xiàn)strlen()的詳細(xì)內(nèi)容,更多關(guān)于C語言實(shí)現(xiàn)strlen()的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)化為后綴表達(dá)式詳解
這篇文章主要為大家詳細(xì)介紹了如何利用C++解決實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式的問題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C++數(shù)據(jù)結(jié)構(gòu)之list詳解
list是一種序列式容器。list容器完成的功能實(shí)際上和數(shù)據(jù)結(jié)構(gòu)中的雙向鏈表是極其相似的,list中的數(shù)據(jù)元素是通過鏈表指針串連成邏輯意義上的線性表,也就是list也具有鏈表的主要優(yōu)點(diǎn),即:在鏈表的任一位置進(jìn)行元素的插入、刪除操作都是快速的2021-11-11C++實(shí)現(xiàn)list增刪查改模擬的示例代碼
本文主要介紹了C++實(shí)現(xiàn)list增刪查改模擬,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-12-12使用Qt的QChartView實(shí)現(xiàn)縮放和放大功能
QCustomPlot是一個(gè)小型的Qt畫圖標(biāo)類,支持繪制靜態(tài)曲線、動(dòng)態(tài)曲線、多重坐標(biāo)曲線,柱狀圖,蠟燭圖,這篇文章主要介紹了Qt的QChartView實(shí)現(xiàn)縮放和放大功能,需要的朋友可以參考下2022-09-09基于C++的攝像頭圖像采集及拼接程序的簡單實(shí)現(xiàn)
本程序是在?ubuntu14.04?平臺(tái)下實(shí)現(xiàn)的,在本項(xiàng)目目錄下,已經(jīng)有編譯生成的可執(zhí)行程序,其中Camera_to_Frmae.cpp是我們從雙攝像頭實(shí)時(shí)抓取單幀圖像的源碼,對基于C++的攝像頭圖像采集及拼接程序的實(shí)現(xiàn)感興趣的朋友一起看看吧2022-01-01