最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言strlen函數(shù)全方位講解

 更新時(shí)間:2022年09月20日 10:15:52   作者:白朝槿kk  
在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ù)要小

strlen函數(shù)的講解

strlen函數(shù)我們應(yīng)該不陌生,它可以幫助我們求字符串的長(zhǎng)度(不包括’\0’),但里面還有一些細(xì)節(jié)需要我們注意。看一下下面這張圖:

strlen函數(shù)的頭文件是<string.h>.如果要使用strlen這個(gè)函數(shù),別忘記引頭文件。

字符串是以 ‘\0’ 作為結(jié)束標(biāo)志,strlen函數(shù)返回的是在字符串中 ‘\0’ 前面出現(xiàn)的字符個(gè)數(shù)。以下是用strlen函數(shù)時(shí)可能會(huì)遇到的幾種問(wèn)題,先看代碼:

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "qwer";
	char arr2[] = { 'q','w','e','r' };
	char arr3[] = { 'q','w','e','r','\0'};
	char arr4[10]= { 'q','w','e','r' };
	printf("arr1:%d\n", strlen(arr1));
	printf("arr2:%d\n", strlen(arr2));
	printf("arr2:%d\n", strlen(arr3));
	printf("arr2:%d\n", strlen(arr4));
	return 0;
}

以上代碼輸出的結(jié)果是什么?大家可以先試著算一下。然后再看運(yùn)行結(jié)果。

運(yùn)行結(jié)果如圖所示,arr1初始化的時(shí)候存放的是字符串,字符串的是以’\0’ 為結(jié)束標(biāo)志的,所以arr1的大小為4。這個(gè)應(yīng)該問(wèn)題不大。

重點(diǎn)說(shuō)一下下面這幾個(gè)。

arr2:我在初始化arr2的時(shí)候,是對(duì)arr2是以字符進(jìn)行初始化的,但是我沒(méi)有設(shè)置arr的大小,所以編譯器是不知道arr2的大小的,后面存放的是什么東西也是不知道的,但是strlen它是找’\0’的,并返回’\0’之前字符的個(gè)數(shù)。所以

在strlen找到’\0’之前,前面有36個(gè)字符。

arr3:arr3與arr2不同的是,但是我在最后輸入了’\0’進(jìn)行初始化,所以arr3很簡(jiǎn)單的就找到了’\0’,并返回4。

arr4:arr4與arr2不同的是:我這次設(shè)置了arr4的大小,然后我用字符對(duì)arr4進(jìn)行了初始化,雖然是用字符進(jìn)行的部分初始化,但是編譯器會(huì)幫我把沒(méi)初始化的地方默認(rèn)初始化為0,‘\0’的ASCII碼值就是0,C語(yǔ)言字符在內(nèi)存的形式就是ASCII碼值,所以后面沒(méi)初始化的地方存放的都是’\0’。

我們?cè)賮?lái)看一個(gè)東西,由上面的圖,我們還可以知道strlen的返回值是size_t,這是一個(gè)無(wú)符號(hào)數(shù)。如果不清楚這個(gè)地方,我們也可能會(huì)在使用strlen的時(shí)候出現(xiàn)一些問(wèn)題。看一下下面的代碼:

#include<stdio.h>
#include<string.h>
int main()
{
	if (strlen("abc") - strlen("qwer") < 0)
	{
		printf("1");
	}
	else
	{
		printf("0");
	}
	return 0;
}

對(duì)于上面的代碼的運(yùn)行結(jié)果是什么?

按常理來(lái)說(shuō),前面的字符串大小為3,后面的為4,比4小應(yīng)該會(huì)打印1。我們來(lái)看運(yùn)行結(jié)果:

它的運(yùn)行結(jié)果是0,難道前面的字符串大小比后面的大嗎,其實(shí)不是。關(guān)鍵在于它的返回值是一個(gè)無(wú)符號(hào)數(shù)。無(wú)符號(hào)數(shù)只有正數(shù),沒(méi)有負(fù)數(shù)。3-4=-1,但是此時(shí)的-1并不是有符號(hào)數(shù),而是一個(gè)無(wú)符號(hào)數(shù),那么-1此時(shí)就是一個(gè)很大的正數(shù)。所以此時(shí)才會(huì)輸出0

如果要解決這個(gè)問(wèn)題,有以下兩種解決方案:

方法1:不相減,進(jìn)行比較:

#include<stdio.h>
#include<string.h>
int main()
{
	if (strlen("abc") < strlen("qwer"))
	{
		printf("1");
	}
	else
	{
		printf("0");
	}
	return 0;
}

方法2:強(qiáng)制類型轉(zhuǎn)換

#include<stdio.h>
#include<string.h>
int main()
{
	if ((int)strlen("abc") -(int)strlen("qwer") < 0)
	{
		printf("1");
	}
	else
	{
		printf("0");
	}
	return 0;
}

說(shuō)一下方法1,無(wú)符號(hào)數(shù)只有正數(shù),沒(méi)有負(fù)數(shù),直接計(jì)算大?。ㄕ龜?shù))就可以直接比較了。方法2是強(qiáng)制轉(zhuǎn)換為int類型的數(shù)據(jù),整型是有符號(hào)數(shù),有符號(hào)數(shù)就可以進(jìn)行相減,結(jié)果為-1,就是-1。兩種結(jié)果輸出結(jié)果都是1.

strlen函數(shù)的模擬實(shí)現(xiàn)

講完了strlen函要注意的問(wèn)題,下面講一下strlen函數(shù)的模擬實(shí)現(xiàn)??偣灿腥N方法:計(jì)數(shù)器方式,遞歸的方式和指針-指針的方式。

計(jì)數(shù)器方式

實(shí)現(xiàn)的思想:設(shè)置一個(gè)計(jì)數(shù)的變量,讓一個(gè)字符指針遍歷字符數(shù)組的每一個(gè)元素,如果指針指向的元素不是’\0’,計(jì)算器就自增,直到指針指向的元素是’\0’,就停止遍歷,并返回計(jì)數(shù)器。

因?yàn)槭悄M實(shí)現(xiàn),我們就只求一致,返回值就設(shè)置為size_t。

實(shí)現(xiàn)代碼如下:

#include<stdio.h>
#include<string.h>
#include<assert.h>
size_t my_strlen(const char* p)
{
	int count = 0;
	assert(p != NULL);//如果等于空指針就會(huì)報(bào)錯(cuò)
	while((*p) != '\0')
	{
		count++;
		p++;
	}
	return count;
}
int main()
{
	char arr[] = "CSDN";
	int ret = my_strlen(arr);
	printf("%d", ret);
	return 0;
}

遞歸的方式

代碼實(shí)現(xiàn)的思想:這種方式是不用創(chuàng)建臨時(shí)變量的一種方法, 只使用指針進(jìn)行遍歷,如果指針指向的不是’\0’,那么就返回1和指針指向后一個(gè)數(shù)據(jù)的結(jié)果。

size_t my_strlen(const char* p)
{
	if ((*p) == '\0')
	{
		return 0;
	}
	else
	{
		return 1 + my_strlen(p+1);
	}
}
int main()
{
	char arr[] = "CSDN";
	int ret = my_strlen(arr);
	printf("%d", ret);
	return 0;
}

指針減指針的方式

代碼實(shí)現(xiàn)的思想:

元素名是首元素的地址,我們就在定義一個(gè)指針,指向這個(gè)數(shù)組,讓這個(gè)指針進(jìn)行遍歷,指向的不是’\0’就讓指針進(jìn)行自增。最后讓遍歷完數(shù)組的指針減去數(shù)組名(也就是首元素的地址)。

注意:當(dāng)兩個(gè)指著指向同一塊空間時(shí),指針減指針的絕對(duì)值就是兩個(gè)指針之間的元素個(gè)數(shù),而不是 個(gè)數(shù)*數(shù)據(jù)類型所占的空間。

size_t my_strlen(const char* p)
{
	char* s = p;
	while((*s) != '\0')
	{
		s++;
	}
	return s - p;
}
int main()
{
	char arr[] = "CSDN";
	int ret = my_strlen(arr);
	printf("%d", ret);
	return 0;
}

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

相關(guān)文章

  • C/C++編程判斷String字符串是否包含某個(gè)字符串實(shí)現(xiàn)示例

    C/C++編程判斷String字符串是否包含某個(gè)字符串實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了C++編程中判斷String字符串是否包含某個(gè)字符串的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • C語(yǔ)言遞歸在實(shí)踐題目中應(yīng)用詳解

    C語(yǔ)言遞歸在實(shí)踐題目中應(yīng)用詳解

    遞歸是C語(yǔ)言中非常重要的知識(shí)點(diǎn),其中的大事化小等思想對(duì)初學(xué)C語(yǔ)言的小伙伴來(lái)說(shuō)不是很友好,因此我整理了遞歸的經(jīng)典題目并向外拓展,給你全面的介紹,重新認(rèn)識(shí)遞歸
    2022-05-05
  • C++鍵盤(pán)記錄程序代碼

    C++鍵盤(pán)記錄程序代碼

    這篇文章主要介紹了C++鍵盤(pán)記錄程序代碼,是Windows應(yīng)用程序開(kāi)發(fā)中非常實(shí)用的功能,該功能也常被一些遠(yuǎn)程操控程序所實(shí)用,需要的朋友可以參考下
    2014-10-10
  • 基于C++ bitset常用函數(shù)及運(yùn)算符(詳解)

    基于C++ bitset常用函數(shù)及運(yùn)算符(詳解)

    下面小編就為大家?guī)?lái)一篇基于C++ bitset常用函數(shù)及運(yùn)算符(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • 常用C/C++預(yù)處理指令詳解

    常用C/C++預(yù)處理指令詳解

    預(yù)處理指令提供按條件跳過(guò)源文件中的節(jié)、報(bào)告錯(cuò)誤和警告條件,以及描繪源代碼的不同區(qū)域的能力。使用術(shù)語(yǔ)“預(yù)處理指令”只是為了與 C 和 C++ 編程語(yǔ)言保持一致。在 C# 中沒(méi)有單獨(dú)的預(yù)處理步驟;預(yù)處理指令按詞法分析階段的一部分處理。
    2014-11-11
  • 淺析string 與char* char[]之間的轉(zhuǎn)換

    淺析string 與char* char[]之間的轉(zhuǎn)換

    與char*不同的是,string不一定以NULL('\0')結(jié)束。string長(zhǎng)度可以根據(jù)length()得到,string可以根據(jù)下標(biāo)訪問(wèn)。所以,不能將string直接賦值給char*
    2013-10-10
  • C/C++中一次性執(zhí)行多個(gè)DOS命令的實(shí)現(xiàn)思路

    C/C++中一次性執(zhí)行多個(gè)DOS命令的實(shí)現(xiàn)思路

    在C語(yǔ)言中執(zhí)行DOS命令的方法很多,在這就不一給大家一一介紹了,本文重點(diǎn)給大家介紹C/C++中一次性執(zhí)行多個(gè)DOS命令的實(shí)現(xiàn)思路,需要的朋友參考下
    2017-12-12
  • C語(yǔ)言怎樣用指針指向字符串

    C語(yǔ)言怎樣用指針指向字符串

    這篇文章主要介紹了C語(yǔ)言怎樣用指針指向字符串問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • C++程序代碼的五大內(nèi)存分區(qū)方式

    C++程序代碼的五大內(nèi)存分區(qū)方式

    這篇文章主要介紹了C++程序代碼的五大內(nèi)存分區(qū)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 關(guān)于數(shù)據(jù)結(jié)構(gòu)單向鏈表的各種操作

    關(guān)于數(shù)據(jù)結(jié)構(gòu)單向鏈表的各種操作

    這篇文章主要介紹了關(guān)于數(shù)據(jù)結(jié)構(gòu)單向鏈表的各種操作,關(guān)于數(shù)據(jù)結(jié)構(gòu)鏈表的操作一般涉及的就是增刪改查,下面將關(guān)于無(wú)空頭鏈表展開(kāi)介紹,需要的朋友可以參考下
    2023-04-04

最新評(píng)論

永川市| 印江| 建德市| 麻栗坡县| 嘉祥县| 湖北省| 繁昌县| 从江县| 扎鲁特旗| 勃利县| 平果县| 黄石市| 武平县| 康平县| 阿图什市| 永昌县| 永寿县| 县级市| 安徽省| 卢湾区| 日喀则市| 西畴县| 旬邑县| 富阳市| 榆中县| 南溪县| 肇源县| 平乐县| 宁武县| 玉林市| 手游| 文昌市| 交城县| 贺州市| 芮城县| 耒阳市| 嘉峪关市| 高邮市| 祁东县| 巴青县| 新竹县|