亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言strlen函數全方位講解

 更新時間:2022年09月20日 10:15:52   作者:白朝槿kk  
在C語言中我們要獲取字符串的長度,可以使用strlen函數,strlen函數計算字符串的長度時,直到空結束字符,但不包括空結束字符,因為 strlen函數時不包含最后的結束字符的,因此一般使用strlen函數計算的字符串的長度會比使用sizeof計算的字符串的字節(jié)數要小

strlen函數的講解

strlen函數我們應該不陌生,它可以幫助我們求字符串的長度(不包括’\0’),但里面還有一些細節(jié)需要我們注意??匆幌孪旅孢@張圖:

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

字符串是以 ‘\0’ 作為結束標志,strlen函數返回的是在字符串中 ‘\0’ 前面出現的字符個數。以下是用strlen函數時可能會遇到的幾種問題,先看代碼:

#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;
}

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

運行結果如圖所示,arr1初始化的時候存放的是字符串,字符串的是以’\0’ 為結束標志的,所以arr1的大小為4。這個應該問題不大。

重點說一下下面這幾個。

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

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

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

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

我們再來看一個東西,由上面的圖,我們還可以知道strlen的返回值是size_t,這是一個無符號數。如果不清楚這個地方,我們也可能會在使用strlen的時候出現一些問題??匆幌孪旅娴拇a:

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

對于上面的代碼的運行結果是什么?

按常理來說,前面的字符串大小為3,后面的為4,比4小應該會打印1。我們來看運行結果:

它的運行結果是0,難道前面的字符串大小比后面的大嗎,其實不是。關鍵在于它的返回值是一個無符號數。無符號數只有正數,沒有負數。3-4=-1,但是此時的-1并不是有符號數,而是一個無符號數,那么-1此時就是一個很大的正數。所以此時才會輸出0

如果要解決這個問題,有以下兩種解決方案:

方法1:不相減,進行比較:

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

方法2:強制類型轉換

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

說一下方法1,無符號數只有正數,沒有負數,直接計算大小(正數)就可以直接比較了。方法2是強制轉換為int類型的數據,整型是有符號數,有符號數就可以進行相減,結果為-1,就是-1。兩種結果輸出結果都是1.

strlen函數的模擬實現

講完了strlen函要注意的問題,下面講一下strlen函數的模擬實現??偣灿腥N方法:計數器方式,遞歸的方式和指針-指針的方式。

計數器方式

實現的思想:設置一個計數的變量,讓一個字符指針遍歷字符數組的每一個元素,如果指針指向的元素不是’\0’,計算器就自增,直到指針指向的元素是’\0’,就停止遍歷,并返回計數器。

因為是模擬實現,我們就只求一致,返回值就設置為size_t。

實現代碼如下:

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

遞歸的方式

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

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;
}

指針減指針的方式

代碼實現的思想:

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

注意:當兩個指著指向同一塊空間時,指針減指針的絕對值就是兩個指針之間的元素個數,而不是 個數*數據類型所占的空間。

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;
}

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

相關文章

  • C++實現LeetCode(13.羅馬數字轉化成整數)

    C++實現LeetCode(13.羅馬數字轉化成整數)

    這篇文章主要介紹了C++實現LeetCode(13.羅馬數字轉化成整數),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • C++ 中的Swap函數寫法匯總

    C++ 中的Swap函數寫法匯總

    這篇文章主要介紹了C++ 中的Swap函數寫法匯總,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • C++課程設計之學生成績管理系統(tǒng)

    C++課程設計之學生成績管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++課程設計之學生成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++類中的常數據成員與靜態(tài)數據成員之間的區(qū)別

    C++類中的常數據成員與靜態(tài)數據成員之間的區(qū)別

    常數據成員是指在類中定義的不能修改其值的一些數據成員,類似于我們以前學過的常變量,雖然是變量,也有自己的地址,但是一經賦初值,便不能再被修改
    2013-10-10
  • 原創(chuàng)的C語言控制臺小游戲

    原創(chuàng)的C語言控制臺小游戲

    本文給大家分享的是個人原創(chuàng)設計的一個C語言控制臺小游戲,非常的簡單,但是挺好玩的,推薦給大家,有需要的小伙伴也可以自由擴展下。
    2015-03-03
  • C/C++實現string和int相互轉換的常用方法總結

    C/C++實現string和int相互轉換的常用方法總結

    在C++編程中,經常需要在字符串(string)和整型(int)之間進行轉換,本文將詳細介紹幾種在C和C++中實現這兩種類型轉換的常用方法,有需要的可以參考下
    2024-01-01
  • C語言中計算函數執(zhí)行時間的三種方式

    C語言中計算函數執(zhí)行時間的三種方式

    本文主要介紹了C語言中計算函數執(zhí)行時間的三種方式,主要包括clock(),timeb和time,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • C++?結合?opencv讀取圖片與視頻的方法

    C++?結合?opencv讀取圖片與視頻的方法

    這篇文章主要介紹了C++?結合?opencv讀取圖片與視頻,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • 基于C++制作一個簡單的跑酷游戲

    基于C++制作一個簡單的跑酷游戲

    這篇文章主要為大家詳細介紹了如何利用C++制作一個簡單的跑酷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2023-06-06
  • 漫畫講解C語言中最近公共祖先的三種類型

    漫畫講解C語言中最近公共祖先的三種類型

    這篇文章主要總結了使用C語言查找最近公共祖先的三種方法類型,用漫畫的方式講解原理定義,看上去更生動形象,幫助你更好的理解透徹,快來跟著本文往下看吧
    2021-11-11

最新評論