欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言?模擬實(shí)現(xiàn)strlen函數(shù)詳解

 更新時(shí)間:2022年04月08日 18:11:08   作者:不一樣的煙火a  
在 C 語(yǔ)言 中我們要獲取 字符串 的長(zhǎng)度,可以使用strlen 函數(shù),strlen 函數(shù)計(jì)算字符串的長(zhǎng)度時(shí),直到空結(jié)束字符,但不包括空結(jié)束字符,因?yàn)?nbsp;strlen 函數(shù)時(shí)不包含最后的結(jié)束字符的,因此一般使用 strlen函數(shù)計(jì)算的字符串的長(zhǎng)度會(huì)比使用 sizeof 計(jì)算的字符串的字節(jié)數(shù)要小

前言

用C語(yǔ)言模擬實(shí)現(xiàn)strlen函數(shù),我這里有三種方法,快來(lái)看看跟你用的方法是否是一樣。

一.strlen函數(shù)的介紹

1.strlen函數(shù)的聲明

size_t strlen ( const char * str );

這里函數(shù)的返回值為無(wú)符號(hào)整形(size_t),傳入的是一個(gè)常量char*類型的指針。

2.strlen函數(shù)的簡(jiǎn)單運(yùn)用

用strlen函數(shù)可以求出字符串的長(zhǎng)度

#include<stdio.h>
#include<string.h>
int main()
{
	char str[] = "qwerty";
	int ret = strlen(str);
	printf("字符串的長(zhǎng)度 = %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' };//這里沒(méi)有以'\0'結(jié)束
	int ret = strlen(str);
	printf("字符串的長(zhǎng)度 = %d\n", ret);
	return 0;
}

代碼運(yùn)行結(jié)果

 其實(shí)這個(gè)代碼的修改方法也很簡(jiǎn)單,例如:

方法1

#include<stdio.h>
#include<string.h>
 
int main()
{
	char str[] = { 'a', 'b', 'c', '\0'};
	int ret = strlen(str);
	printf("字符串的長(zhǎng)度 = %d\n", ret);
	return 0;
}

方法2(如果一個(gè)數(shù)組沒(méi)存滿的話后面的值默認(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("字符串的長(zhǎng)度 = %d\n", ret);
	return 0;
}

代碼運(yùn)行結(jié)果

3.注意函數(shù)的返回值為size_t,是無(wú)符號(hào)的整形( 易錯(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è)>符號(hào)的結(jié)果的原因就在于函數(shù)的返回值為size_t,是無(wú)符號(hào)的整形,兩個(gè)無(wú)符號(hào)整形的數(shù)字相減得到的還是一個(gè)無(wú)符號(hào)整形,雖然這兩個(gè)字符串長(zhǎng)度相減得到的是-3,但是編譯器會(huì)把他當(dāng)成無(wú)符號(hào)的整形,把-3當(dāng)成無(wú)符號(hào)整形將會(huì)是一個(gè)很大的正整數(shù),所以輸出的結(jié)果是>符號(hào)。(這是一個(gè)易錯(cuò)點(diǎn))

二.三種實(shí)現(xiàn)strlen函數(shù)的方法

三個(gè)方法的共同點(diǎn):

1.都要用const修飾指針,因?yàn)閭髦愤M(jìn)來(lái)后只需要判斷這字符串的長(zhǎng)度,并不需要修改字符串的值,所以要用const修飾,這樣使其更安全。

2.都要用assert斷言,斷言傳來(lái)的指針不能為空指針,因?yàn)榭罩羔樖遣荒鼙辉L問(wèn)的。

1.計(jì)數(shù)器的方法

這是最普通的方法,創(chuàng)建一個(gè)計(jì)數(shù)器變量,然后就開(kāi)始找'\0',每經(jīng)過(guò)一個(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ù)器變量,記錄字符串的長(zhǎng)度
	while (*str) //當(dāng)找到'\0'的時(shí)候循環(huán)結(jié)束
	{                                                                                                                                                                                                                                                                                                                                                                              
		count++;//記錄字符串的長(zhǎng)度
		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+記錄字符串長(zhǎng)度
	}
	return 0;
}
int main()
{
	char str[] = "qwerty";
	int ret = my_strlen(str);
	printf("%d", ret);
	return 0;
}

3.指針-指針的方法

我們都知道指針-指針的結(jié)果是他們之間元素的個(gè)數(shù)(因?yàn)檫@個(gè)我在指針初階篇將過(guò),嘻嘻),這個(gè)方法就是利用這個(gè)原理來(lái)寫(xiě)的。所以我們只用找到字符串首字符的地址和'\0'的地址,然后相減就可以得到字符串的長(zhǎng)度了。

#include<stdio.h>
#include<assert.h>
 
size_t my_strlen(const char* str)
{
	assert(str != NULL);//判斷傳入的指針是否為空指針
	const char* start = str;//創(chuàng)建一個(gè)存儲(chǔ)首字符地址的指針,注意也要用const修飾,保持類型一致
	while (*str)//找'\0'的地址
	{
		str++;
	}
	return (str - start);//指針('\0'的地址) - 指針(首字符的地址) = 中間字符的個(gè)數(shù)
}
int main()
{
	char str[] = "qwerty";
	int ret = my_strlen(str);
	printf("字符串的長(zhǎng)度 = %d\n", ret);
	return 0;
}

三種方法的運(yùn)行結(jié)果都是一樣的

到此這篇關(guān)于C語(yǔ)言 模擬實(shí)現(xiàn)strlen函數(shù)詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言 strlen函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 實(shí)現(xiàn)Dijkstra算法最短路徑問(wèn)題詳解

    實(shí)現(xiàn)Dijkstra算法最短路徑問(wèn)題詳解

    這篇文章主要介紹了實(shí)現(xiàn)Dijkstra算法最短路徑問(wèn)題詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 深入解析C++ STL中的常用容器

    深入解析C++ STL中的常用容器

    這里我們不涉及容器的基本操作之類,只是要討論一下各個(gè)容器其各自的特點(diǎn)。STL中的常用容器包括:順序性容器(vector、deque、list)、關(guān)聯(lián)容器(map、set)、容器適配器(queue、stac)
    2013-09-09
  • MFC對(duì)話框?qū)崿F(xiàn)梯形分頁(yè)

    MFC對(duì)話框?qū)崿F(xiàn)梯形分頁(yè)

    這篇文章主要為大家詳細(xì)介紹了MFC對(duì)話框?qū)崿F(xiàn)梯形分頁(yè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • C語(yǔ)言實(shí)現(xiàn)類似wget的進(jìn)度條效果

    C語(yǔ)言實(shí)現(xiàn)類似wget的進(jìn)度條效果

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)類似wget的進(jìn)度條效果的方法,主要是讓大家可以熟練的使用轉(zhuǎn)移符\r,這里推薦給大家,需要的小伙伴參考下。
    2015-03-03
  • 淺析C/C++中的可變參數(shù)與默認(rèn)參數(shù)

    淺析C/C++中的可變參數(shù)與默認(rèn)參數(shù)

    C支持可變參數(shù)的函數(shù),這里的意思是C支持函數(shù)帶有可變數(shù)量的參數(shù),最常見(jiàn)的例子就是我們十分熟悉的printf()系列函數(shù)。我們還知道在函數(shù)調(diào)用時(shí)參數(shù)是自右向左壓棧的
    2013-09-09
  • C++編寫(xiě)LINUX守護(hù)進(jìn)程的實(shí)現(xiàn)代碼

    C++編寫(xiě)LINUX守護(hù)進(jìn)程的實(shí)現(xiàn)代碼

    這篇文章主要介紹了如何使用C++實(shí)現(xiàn)LINUX守護(hù)進(jìn)程,文中代碼非常詳細(xì),供大家學(xué)習(xí)參考,感興趣的小伙伴可以了解下
    2020-06-06
  • C++計(jì)算任意權(quán)值的單源最短路徑(Bellman-Ford)

    C++計(jì)算任意權(quán)值的單源最短路徑(Bellman-Ford)

    這篇文章主要為大家詳細(xì)介紹了C++計(jì)算任意權(quán)值的單源最短路徑,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 判斷指定的進(jìn)程或程序是否存在方法小結(jié)(vc等)

    判斷指定的進(jìn)程或程序是否存在方法小結(jié)(vc等)

    VC判斷進(jìn)程是否存在?比如我想知道記事本是否運(yùn)行,要用到哪些函數(shù)等實(shí)例,需要的朋友可以參考下
    2013-01-01
  • 教你在VS2022?MFC程序中調(diào)用CUDA代碼的方法

    教你在VS2022?MFC程序中調(diào)用CUDA代碼的方法

    這篇文章主要介紹了在VS2022?MFC程序中調(diào)用CUDA代碼,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C語(yǔ)言字符串原地壓縮實(shí)現(xiàn)方法

    C語(yǔ)言字符串原地壓縮實(shí)現(xiàn)方法

    這篇文章主要介紹了C語(yǔ)言字符串原地壓縮實(shí)現(xiàn)方法,包含了字符串的遍歷與轉(zhuǎn)換等操作,是很實(shí)用的操作技巧,需要的朋友可以參考下
    2014-09-09

最新評(píng)論