1. 程式人生 > 其它 >字串函式的模擬實現(strlen、strcpy、strcat、strcmp)

字串函式的模擬實現(strlen、strcpy、strcat、strcmp)

技術標籤:c語言

文章目錄


一、strlen

1.庫函式中的strlen

庫函式中的strlen是用來求字串長度的(不包含’\0’)

用法如下:

int main()
{
	char arr[] = "abcdef";
	int sum =
strlen(arr); printf("%d\n", sum); return 0; }

在這裡插入圖片描述

2.模擬實現strlen

(1)計數器實現

思路:定義一個計數器count,從0開始,當字串元素不為’\0’時,count++,為’\0’時停止

程式碼如下(示例):

int my_strlen1(char* p)
{
	int count = 0;
	while (*p != '\0')
	{
		count++;
		p++;
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	int sum = my_strlen1
(arr); printf("%d\n", sum);//sum = 6 return 0; }

(2)遞迴實現

思路:以字串"abcdef"為例

strlen(“abcdef”)
=1 + strlen(“bcdef”)
=1 + 1 + strlen(“cdef”)
=1 + 1 + 1 + strlen(“def”)
=1 + 1 + 1 + 1 + strlen(“ef”)
=1 + 1 + 1 + 1 + 1 + strlen(“f”)
=1 + 1 + 1 + 1 + 1 + 1 = 6

程式碼如下(示例):

int my_strlen2(char
* p)//p指向字串的首元素 { if (*p != '\0') //直到找到'\0'為止 return 1 + my_strlen2(p + 1); //p+1指向字串的下一個元素 else return 0; } int main() { char arr[] = "abcdef"; sum = my_strlen2(arr); printf("%d\n", sum);//sum = 6 return 0; }

二、strcpy

1.庫函式中的strcpy

庫函式中的strcpy可拷貝字串。
char* strcpy(char* dest, const char* src);
表示將字串src中的內容拷貝到字串dest中(包含’\0’)並返回dest的地址。

用法如下:

int main()
{
	char arr1[50] = "******************";
	char arr2[] = "hello world!";
	char* parr1 = strcpy(arr1, arr2);
	//將arr2中的內容拷貝到arr1中,並返回arr1的地址
	printf("%s\n", arr1);
	printf("%s\n", parr1);
	return 0;
}

在這裡插入圖片描述

2.模擬實現strcpy

思路:遍歷陣列src中的每一個元素,並將每一個元素放入dest中。

程式碼如下(示例):

void my_strcpy(char* dest, char* src)
{
	
	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;
	//將'\0'拷貝到dest中
}

以上程式碼是strcpy的基本功能。
針對以上程式碼可以進行進一步優化。

程式碼如下(示例):

//庫函式中strcpy的返回值是dest的地址
char* my_strcpy(char* dest, const char* src)
//src中的內容不應被改變,加上const來保護
{
	//assert防止出現指向NULL的指標
	assert(dest != NULL);
	assert(src != NULL);
	//assert(dest && src);這種寫法也可以
	char* p = dest;//記錄目標陣列的地址
	while (*dest++ = *src++)
	//遍歷src的每一個元素並拷貝
	//'\0'的ASCII碼值為0
	//當*src為'\0'時迴圈條件為假,退出迴圈
	{
		;
	}
	return p;
}

三、strcat

1.庫函式中的strcat

庫函式中的strcat是字元拼接函式
strcat(arr1, arr2);
表示將arr2中的內容拼接到arr1後面並返回arr1的地址。

用法如下:

int main()
{
	char arr1[50] = "hello ";
	char arr2[] = "world";
	char* ret = strcat(arr1, arr2);
	printf("%s\n", ret);
 	return 0; 
}

在這裡插入圖片描述

2.模擬實現strcat

char* my_strcat(char* dest, const char* src);
思路:先找到dest後字串的’\0’,從該地址開始拷貝src後的字串

程式碼如下(示例):

char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*dest)
	{
		dest++;
	}
	//此時dest是前一個字串'\0'的位置
	//接下來拷貝src後的內容,與strcpy相同
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

四、strcmp

1.庫函式中的strcmp

strcmp(arr1, arr2);
從第一個字元起比較arr1和arr2的每一個字元的ASCII碼值(注意不是比較arr1和arr2的長度),若大於返回大於0的值,小於返回小於0的值,等於返回0。

用法如下:

int main()
{
	int ret = strcmp("abq", "abcd");
	printf("%d\n", ret);
	return 0;
}

在這裡插入圖片描述
注:當兩個字串不相同時,庫中要求返回大於0、小於0的值,有些編譯器將其固定為1和-1。

2.模擬實現strcmp

思路:遍歷兩個字串的每一個元素,直到有不同的字元時停止

int my_strcmp(const char* str1, const char* str2)
//兩個字串都不應被修改,加const保護
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
	//str1 > str2返回大於0的值
	//str1 < str2返回大於0的值
}

感謝閱讀,如有錯誤請批評指正