C語言?模擬實(shí)現(xiàn)strlen函數(shù)詳解
前言
用C語言模擬實(shí)現(xiàn)strlen函數(shù),我這里有三種方法,快來看看跟你用的方法是否是一樣。
一.strlen函數(shù)的介紹
1.strlen函數(shù)的聲明
size_t strlen ( const char * str );
這里函數(shù)的返回值為無符號整形(size_t),傳入的是一個(gè)常量char*類型的指針。
2.strlen函數(shù)的簡單運(yùn)用
用strlen函數(shù)可以求出字符串的長度
#include<stdio.h>
#include<string.h>
int main()
{
char str[] = "qwerty";
int ret = strlen(str);
printf("字符串的長度 = %d\n", ret);
return 0;
}代碼運(yùn)行結(jié)果

3.注意事項(xiàng)
1.字符串是以 '\0' 作為結(jié)束標(biāo)志,strlen函數(shù)返回的是在字符串中 '\0' 前面出現(xiàn)的字符個(gè)數(shù)(不包含 '\0' )。
2.參數(shù)指向的字符串必須要以 '\0' 結(jié)束。
如果不是以'\0'結(jié)束,輸出結(jié)果將是一個(gè)隨機(jī)值,例如:
#include<stdio.h>
#include<string.h>
int main()
{
char str[] = { 'a', 'b', 'c' };//這里沒有以'\0'結(jié)束
int ret = strlen(str);
printf("字符串的長度 = %d\n", ret);
return 0;
}代碼運(yùn)行結(jié)果

其實(shí)這個(gè)代碼的修改方法也很簡單,例如:
方法1
#include<stdio.h>
#include<string.h>
int main()
{
char str[] = { 'a', 'b', 'c', '\0'};
int ret = strlen(str);
printf("字符串的長度 = %d\n", ret);
return 0;
}方法2(如果一個(gè)數(shù)組沒存滿的話后面的值默認(rèn)存0,而'\0'的ASCII碼值就是0)
#include<stdio.h>
#include<string.h>
int main()
{
char str[5] = { 'a', 'b', 'c'};
int ret = strlen(str);
printf("字符串的長度 = %d\n", ret);
return 0;
}代碼運(yùn)行結(jié)果

3.注意函數(shù)的返回值為size_t,是無符號的整形( 易錯(cuò) )
#include<stdio.h>
#include<string.h>
int main()
{
if (strlen("abc") - strlen("abcdefg") > 0)
{
printf(">\n");
}
else
{
printf("<=\n");
}
return 0;
}運(yùn)行結(jié)果

出現(xiàn)這個(gè)>符號的結(jié)果的原因就在于函數(shù)的返回值為size_t,是無符號的整形,兩個(gè)無符號整形的數(shù)字相減得到的還是一個(gè)無符號整形,雖然這兩個(gè)字符串長度相減得到的是-3,但是編譯器會(huì)把他當(dāng)成無符號的整形,把-3當(dāng)成無符號整形將會(huì)是一個(gè)很大的正整數(shù),所以輸出的結(jié)果是>符號。(這是一個(gè)易錯(cuò)點(diǎn))
二.三種實(shí)現(xiàn)strlen函數(shù)的方法
三個(gè)方法的共同點(diǎn):
1.都要用const修飾指針,因?yàn)閭髦愤M(jìn)來后只需要判斷這字符串的長度,并不需要修改字符串的值,所以要用const修飾,這樣使其更安全。
2.都要用assert斷言,斷言傳來的指針不能為空指針,因?yàn)榭罩羔樖遣荒鼙辉L問的。
1.計(jì)數(shù)器的方法
這是最普通的方法,創(chuàng)建一個(gè)計(jì)數(shù)器變量,然后就開始找'\0',每經(jīng)過一個(gè)字符,計(jì)數(shù)器就+1,直到找到'\0'為止。最后將計(jì)數(shù)器的值返回。
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
assert(str != NULL);//判斷傳入的指針是否為空指針
int count = 0;//創(chuàng)建一個(gè)計(jì)數(shù)器變量,記錄字符串的長度
while (*str) //當(dāng)找到'\0'的時(shí)候循環(huán)結(jié)束
{
count++;//記錄字符串的長度
str++;
}
return count;
}
int main()
{
char str[] = "qwerty";
int ret = my_strlen(str);
printf("%d", ret);
return 0;
}2.遞歸方法
一時(shí)遞歸一時(shí)爽,一直遞歸一直爽。(講解全在注釋里面,嘻嘻)
#include<stdio.h>
#include<assert.h>
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.指針-指針的方法
我們都知道指針-指針的結(jié)果是他們之間元素的個(gè)數(shù)(因?yàn)檫@個(gè)我在指針初階篇將過,嘻嘻),這個(gè)方法就是利用這個(gè)原理來寫的。所以我們只用找到字符串首字符的地址和'\0'的地址,然后相減就可以得到字符串的長度了。
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
assert(str != NULL);//判斷傳入的指針是否為空指針
const char* start = str;//創(chuàng)建一個(gè)存儲首字符地址的指針,注意也要用const修飾,保持類型一致
while (*str)//找'\0'的地址
{
str++;
}
return (str - start);//指針('\0'的地址) - 指針(首字符的地址) = 中間字符的個(gè)數(shù)
}
int main()
{
char str[] = "qwerty";
int ret = my_strlen(str);
printf("字符串的長度 = %d\n", ret);
return 0;
}三種方法的運(yùn)行結(jié)果都是一樣的

到此這篇關(guān)于C語言 模擬實(shí)現(xiàn)strlen函數(shù)詳解的文章就介紹到這了,更多相關(guān)C語言 strlen函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語言strlen,strcpy,strcmp,strcat,strstr字符串操作函數(shù)實(shí)現(xiàn)
- C語言之sizeof與strlen的使用及區(qū)別
- C語言數(shù)組長度的計(jì)算方法實(shí)例總結(jié)(sizeof與strlen)
- 淺談C語言中的sizeof()和strlen()的區(qū)別
- C語言strlen函數(shù)實(shí)現(xiàn)讀取字符串長度詳解
- C語言sizeof和strlen的指針和數(shù)組面試題詳解
- 一篇文章教你如何用C語言實(shí)現(xiàn)strcpy和strlen
- C語言基礎(chǔ) strlen 函數(shù)
- C語言strlen函數(shù)全方位講解
相關(guān)文章
使用C++實(shí)現(xiàn)工資管理中的隨機(jī)教師信息生成功能
這篇文章主要介紹了使用C++實(shí)現(xiàn)工資管理中的隨機(jī)教師信息生成功能,想要做一個(gè)教師工資管理系統(tǒng),就必須得準(zhǔn)備好數(shù)據(jù),但是這些數(shù)據(jù)如果用手一行一行地敲,那么工作量是非常大的,因此,我就產(chǎn)生了用C語言實(shí)現(xiàn)直接生成大量的教師基本信息的想法,需要的朋友可以參考下2023-05-05
C++ 中的INT_MAX,INT_MIN數(shù)值大小操作
這篇文章主要介紹了C++ 中的INT_MAX,INT_MIN數(shù)值大小操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
c++ TCHAR轉(zhuǎn)string導(dǎo)致中文缺失或亂碼問題及解決
這篇文章主要介紹了c++ TCHAR轉(zhuǎn)string導(dǎo)致中文缺失或亂碼問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08

