C語(yǔ)言編程之三個(gè)方法實(shí)現(xiàn)strlen函數(shù)
strlen()函數(shù)是來(lái)源于庫(kù)函數(shù)<string.h>
是用于計(jì)算字符串的長(zhǎng)度,
且字符串需要以'\0'結(jié)尾
strlen()會(huì)計(jì)算'\0'前的字符個(gè)數(shù)。
根據(jù)MSDN的描述
size_t strlen(const char* string); size_t==unsigned int;
返回-無(wú)符號(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來(lái)接收。同樣的判斷條件,進(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
三,指針減指針?lè)?/h2>
指針相減,得到的不是指針,而是兩指針間的元素個(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語(yǔ)言編程之三個(gè)方法實(shí)現(xiàn)strlen()的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言實(shí)現(xiàn)strlen()的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言運(yùn)用函數(shù)的遞歸實(shí)現(xiàn)漢諾塔
遞歸(recursive)函數(shù)是“自己調(diào)用自己”的函數(shù),無(wú)論是采用直接或間接調(diào)用方式。間接遞歸意味著函數(shù)調(diào)用另一個(gè)函數(shù)(然后可能又調(diào)用第三個(gè)函數(shù)等),最后又調(diào)用第一個(gè)函數(shù)。因?yàn)楹瘮?shù)不可以一直不停地調(diào)用自己,所以遞歸函數(shù)一定具備結(jié)束條件2022-07-07
C++中for循環(huán)與while循環(huán)的區(qū)別總結(jié)
這篇文章主要給大家介紹了關(guān)于C++中for循環(huán)與while循環(huán)的區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
通過(guò)C++程序示例理解設(shè)計(jì)模式中的外觀模式
這篇文章主要介紹了通過(guò)設(shè)計(jì)模式中的外觀模式及相關(guān)的C++程序示例,外觀模式在高層提供了一個(gè)統(tǒng)一的接口實(shí)現(xiàn)一定程度上的解耦,需要的朋友可以參考下2016-03-03
C語(yǔ)言?分析逆序字符串與字符串的逆序輸出有什么區(qū)別
例如,給定一個(gè)字符串?s,將?s?中的字符順序顛倒過(guò)來(lái),如?s?=?“abcd”,逆序后變成?“dcba”??梢圆捎枚喾N方法對(duì)字符串進(jìn)行逆序,以下將對(duì)其中的方法和字符串的逆序輸出的區(qū)別進(jìn)行分析2022-04-04
利用stream實(shí)現(xiàn)一個(gè)簡(jiǎn)單的http下載器
這篇文章主要介紹了利用stream實(shí)現(xiàn)一個(gè)簡(jiǎn)單的http下載器的相關(guān)資料,需要的朋友可以參考下2015-03-03
VS2017+Qt5+Opencv3.4調(diào)用攝像頭拍照并存儲(chǔ)
本文主要介紹了VS2017+Qt5+Opencv3.4調(diào)用攝像頭拍照并存儲(chǔ),實(shí)現(xiàn)了視頻,拍照,保存這三個(gè)功能。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05
C++ 中回文數(shù)判斷簡(jiǎn)單實(shí)例
這篇文章主要介紹了C++ 中回文數(shù)判斷簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05

