C語言自定義實(shí)現(xiàn)strlen函數(shù)的3種方法總結(jié)
在自定義實(shí)現(xiàn)strlen函數(shù)之前,我們簡單的介紹一下strlen函數(shù)。strlen的功能就是求字符串長度。它只能作用于字符串,是C語言中的庫函數(shù),使用時(shí)要引用 < string.h> 這個(gè)頭文件。每個(gè)字符串結(jié)尾處都隱藏有 ‘\0’ ,它是字符串的結(jié)束標(biāo)志,所以我們?cè)谟胹trlen函數(shù)求字符串長度時(shí),遇見 ‘\0’ 時(shí)就停止讀取字符串,字符串長度為 ‘\0’ 之前的字符個(gè)數(shù),不包括 ‘\0’ 。
簡單介紹strlen函數(shù)之后,讓我們開始正文
1.計(jì)數(shù)器
這是3種方法里面最簡單的一種,只用將數(shù)組作為函數(shù)參數(shù),再用計(jì)數(shù)器i充當(dāng)數(shù)組下標(biāo),若arr[i]不是轉(zhuǎn)義字符 ‘\0’ ,i++;直到為 ‘\0’ 時(shí),返回計(jì)數(shù)器i
int my_strlen(char arr[]) { int i = 0; while (arr[i] != '\0') { i++; } return i; } int main() { char arr[] = "abcdefg";//abcdefg\0 int len = my_strlen(arr); printf("%d", len); return 0; } //7
2.遞歸(不用創(chuàng)造臨時(shí)變量)
將數(shù)組作為函數(shù)實(shí)參,實(shí)際上傳過去的是數(shù)組首元素地址,用指針接收變量str接收,對(duì)str進(jìn)行解引用操作找到str指向的字符,若該字符為 ‘\0’ ,則返回0;否則返回1+my_strlen(str + 1),再進(jìn)入my_strlen函數(shù)時(shí),str指向下一位,繼續(xù)上述判斷。
例如:若下面代碼中char arr[ ]=“ab”,將數(shù)組名arr作為函數(shù)實(shí)參,用指針str接收,此時(shí)str指向數(shù)組首元素即字符a。對(duì)指針str進(jìn)行解應(yīng)用str=a,a!= ‘\0’ ,所以函數(shù)返回1+my_strlen(str + 1),再進(jìn)行下一次遞歸, 此時(shí)str指向下一位字符b。對(duì)指針str進(jìn)行解應(yīng)用str=b,b!= ‘\0’ ,所以函數(shù)返回1+my_strlen(str+1),再進(jìn)行下一次遞歸, 此時(shí)str指向下一位字符 ‘\0’ 。對(duì)指針str進(jìn)行解應(yīng)用*str= ‘\0’ ,所以函數(shù)返回0,接著返回上一次遞歸,此時(shí)str指向字符b,my_strlen(str + 1) 的結(jié)果為0,所以1+my_strlen(str + 1)的結(jié)果=1并再將1返回上一次遞歸。此時(shí)str指向字符a,my_strlen(str + 1)的結(jié)果=1,所以1+my_strlen(str + 1)結(jié)果=2,將2作為最后的值返回。
int my_strlen(char* str) { if (*str == '\0') return 0; else return 1 + my_strlen(str + 1); } int main() { char arr[] = "abcdefg";//abcdefg\0 int len = my_strlen(arr); printf("%d", len); return 0; }
3.指針(指針-指針的差值的絕對(duì)值是它們之間的元素個(gè)數(shù))
思想:只要最后指針str指向的是 ‘\0’ ,指針start指向的是數(shù)組首元素a,那么str - start就是字符串長度
創(chuàng)建指針變量start存放數(shù)組首元素地址(str就是數(shù)組首元素地址),再用while循環(huán)使得str最后指向 ‘\0’ ,返回兩指針的差值
int my_strlen(char* str) { char* start = str; while (*str != '\0') { str++; } return str - start; } int main() { char arr[] = "abcdefg"; int len = my_strlen(arr); printf("%d", len); return 0; }
到此這篇關(guān)于C語言自定義實(shí)現(xiàn)strlen函數(shù)的3種方法總結(jié)的文章就介紹到這了,更多相關(guān)C語言實(shí)現(xiàn)strlen函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言fprintf()函數(shù)和fscanf()函數(shù)的具體使用
本文主要介紹了C語言fprintf()函數(shù)和fscanf()函數(shù)的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11C語言學(xué)生信息管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了C語言學(xué)生信息管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01C++ vector的介紹及常見功能實(shí)現(xiàn)
這篇文章主要介紹了C++ vector的介紹及模擬實(shí)現(xiàn),vector在實(shí)際中非常的重要,但在實(shí)際中我們只要熟悉常見的接口就可以了,最重要的是理解他的底層原理,要能夠自己模擬實(shí)現(xiàn)出一個(gè)簡單的vector,本文結(jié)合示例代碼給大家詳細(xì)介紹,需要的朋友可以參考下2023-05-05Opencv?視頻讀取與寫入的實(shí)現(xiàn)示例
本文將介紹如何使用OpenCV進(jìn)行視頻讀寫。通過閱讀本文,您將了解如何讀取視頻文件、處理視頻幀、寫入視頻文件等操作,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08C語言用遞歸函數(shù)對(duì)素?cái)?shù)進(jìn)行判斷流程
素?cái)?shù)判斷是編程語言學(xué)習(xí)過程中一個(gè)老生常談的話題,而它的實(shí)現(xiàn)也有多種算法,包括經(jīng)典的試除法(以及試除法的幾種優(yōu)化),進(jìn)階的素?cái)?shù)表篩選法,埃拉托斯特尼篩法和歐拉篩法(以及它們的優(yōu)化)等。對(duì)以上算法感興趣的朋友們,不妨搜索“素?cái)?shù)判斷的N種境界”來學(xué)習(xí)了解2022-09-09C++詳細(xì)實(shí)現(xiàn)完整圖書管理功能
隨著網(wǎng)絡(luò)技術(shù)的高速發(fā)展,計(jì)算機(jī)應(yīng)用的普及,利用計(jì)算機(jī)對(duì)圖書館的日常工作進(jìn)行管理勢(shì)在必行,本篇文章涵蓋一個(gè)圖書管理系統(tǒng)的全部實(shí)現(xiàn)代碼,大家可以查缺補(bǔ)漏,提升水平2022-05-05C語言編程中對(duì)目錄進(jìn)行基本的打開關(guān)閉和讀取操作詳解
這篇文章主要介紹了C語言編程中對(duì)目錄進(jìn)行基本的打開關(guān)閉和讀取操作,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09C語言實(shí)現(xiàn)旅游景點(diǎn)咨詢系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)旅游景點(diǎn)咨詢系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12