首頁 > 軟體

C語言 模擬實現strlen函數詳解

2022-04-08 22:00:18

前言

用C語言模擬實現strlen函數,我這裡有三種方法,快來看看跟你用的方法是否是一樣。

一.strlen函數的介紹

1.strlen函數的宣告

size_t strlen ( const char * str );

這裡函數的返回值為無符號整形(size_t),傳入的是一個常數char*型別的指標。

2.strlen函數的簡單運用

用strlen函數可以求出字串的長度

#include<stdio.h>
#include<string.h>
int main()
{
	char str[] = "qwerty";
	int ret = strlen(str);
	printf("字串的長度 = %dn", ret);
	return 0;
}

程式碼執行結果

3.注意事項

1.字串是以 '' 作為結束標誌,strlen函數返回的是在字串中 '' 前面出現的字元個數(不包含 '' )。

2.引數指向的字串必須要以 '' 結束。

如果不是以''結束,輸出結果將是一個隨機值,例如:

#include<stdio.h>
#include<string.h>
 
int main()
{
	char str[] = { 'a', 'b', 'c' };//這裡沒有以''結束
	int ret = strlen(str);
	printf("字串的長度 = %dn", ret);
	return 0;
}

程式碼執行結果

 其實這個程式碼的修改方法也很簡單,例如:

方法1

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

方法2(如果一個陣列沒存滿的話後面的值預設存0,而''的ASCII碼值就是0)

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

程式碼執行結果

3.注意函數的返回值為size_t,是無符號的整形( 易錯 )

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

執行結果

出現這個>符號的結果的原因就在於函數的返回值為size_t,是無符號的整形,兩個無符號整形的數位相減得到的還是一個無符號整形,雖然這兩個字串長度相減得到的是-3,但是編譯器會把他當成無符號的整形,把-3當成無符號整形將會是一個很大的正整數,所以輸出的結果是>符號。(這是一個易錯點)

二.三種實現strlen函數的方法

三個方法的共同點:

1.都要用const修飾指標,因為傳址進來後只需要判斷這字串的長度,並不需要修改字串的值,所以要用const修飾,這樣使其更安全。

2.都要用assert斷言,斷言傳來的指標不能為空指標,因為空指標是不能被存取的。

1.計數器的方法

這是最普通的方法,建立一個計數器變數,然後就開始找'',每經過一個字元,計數器就+1,直到找到''為止。最後將計數器的值返回。

#include<stdio.h>
#include<assert.h>
 
size_t my_strlen(const char* str)
{
	assert(str != NULL);//判斷傳入的指標是否為空指標
	int count = 0;//建立一個計數器變數,記錄字串的長度
	while (*str) //當找到''的時候迴圈結束
	{                                                                                                                                                                                                                                                                                                                                                                              
		count++;//記錄字串的長度
		str++;
	}
	return count;
}
int main()
{
	char str[] = "qwerty";
	int ret = my_strlen(str);
	printf("%d", ret);
	return 0;
}

2.遞迴方法

一時遞迴一時爽,一直遞迴一直爽。(講解全在註釋裡面,嘻嘻)

#include<stdio.h>
#include<assert.h>
 
size_t my_strlen(const char* str)
{
	assert(str != NULL);//判斷傳入的指標是否為空指標
	if (*str)//一直遞迴,直到找到''為止
	{
		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.指標-指標的方法

我們都知道指標-指標的結果是他們之間元素的個數(因為這個我在指標初階篇將過,嘻嘻),這個方法就是利用這個原理來寫的。所以我們只用找到字串首字元的地址和''的地址,然後相減就可以得到字串的長度了。

#include<stdio.h>
#include<assert.h>
 
size_t my_strlen(const char* str)
{
	assert(str != NULL);//判斷傳入的指標是否為空指標
	const char* start = str;//建立一個儲存首字元地址的指標,注意也要用const修飾,保持型別一致
	while (*str)//找''的地址
	{
		str++;
	}
	return (str - start);//指標(''的地址) - 指標(首字元的地址) = 中間字元的個數
}
int main()
{
	char str[] = "qwerty";
	int ret = my_strlen(str);
	printf("字串的長度 = %dn", ret);
	return 0;
}

三種方法的執行結果都是一樣的

到此這篇關於C語言 模擬實現strlen函數詳解的文章就介紹到這了,更多相關C語言 strlen函數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com