c语言实现库函数

目录

一.strlen函数

1.描述

2.实现

1.计数的方法

2.函数递归的方法

3.指针 - 指针方法

二.strcmp函数

1.描述

 2.实现

三.strcpy函数的实现

1.描述

2.实现

四.strcat函数的实现

1.描述

2.实现

五.strstr函数的实现

1.描述

2.实现

1.BF算法实现

2.kmp算法的实现


一.strlen函数

1.描述

C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。strlen函数实际上时以size_t为返回类型遍历字符串,直到遇到'\0'停止遍历,返回字符串长度的函数。其*str为需要计算的字符串

2.实现

1.计数的方法

size_t my_strlen(const char* dest)
{
	assert(dest);
	int count = 0;
	while (*dest)
	{
		count++;
		dest++;
	}
	return count;
}

2.函数递归的方法

size_t my_strlen(const char* dest)
{
	assert(dest);
	if (*dest) return 1 + my_strlen(dest + 1);
	else return 0;
}

3.指针 - 指针方法

size_t my_strlen(const char* dest)
{
	assert(dest);
	const char* ret = dest;
	while (*dest++)
	{
		;
	}
	return dest - ret;
}

二.strcmp函数

1.描述

strcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。

 2.实现

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	return (*str1 - *str2);
}//范围值为0时说明两个字符串相同,输出大于0的时候说明str1大于str2,小于相反

三.strcpy函数的实现

1.描述

C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest

需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况

2.实现

char* my_strcpy(char* dest, const char* src)
{
	assert(dest&&src);
	char* ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

四.strcat函数的实现

1.描述

 C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。

2.实现

char* my_strcat(char* dest, const char* str)
{
	char* ret = dest;
	while (*dest)
	{
		dest++;
	}
	while (*dest++ = *str++)
	{
		;
	}
	return ret;
}

五.strstr函数的实现

1.描述

C 库函数 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。

2.实现

1.BF算法实现

char* my_strstr2(const char* str1, const char* str2)
{//BF方法,返回指针
	int lenstr1 = strlen(str1);
	int lenstr2 = strlen(str2);
	int i = 0;
	int j = 0;
	while (i < lenstr1 && j < lenstr2)
	{
		if (*(str1 + i) == *(str2 + j))
		{
			i++;
			j++;
		}
		else
		{
			i = i - j + 1;
			j = 0;
		}//假如没找到就j = 0,i返回之前找的位置的后一位	
	}
	if (j >= lenstr2)//走完了子串
	{
		char* ret = (char*)str1 + (i - j);//str是const char*类型因此我们需要强制类型转换一下转换成为char*
		return ret;
	}
	return NULL;
}

2.kmp算法的实现

void Getnext(int* next, const char* sub)
{
	int len = strlen(sub);
	 next[0] = -1;
	 next[1] = 0;
	 int i = 2;//从next[2]开始遍历
	 int k = 0;
	 while (i < len)
	 {
		 //i一直往前走,k可以变换
		 if ((k == -1) || (sub[k] == sub[i - 1]))//因为数组整体往右加一
		 {
			 //当sub[k] == sub[i]
			 //next[i+1] == k + 1 
			 next[i] = k + 1;
			 i++;
			 k++;
		 }
		 else
		 {
			 k = next[k];
		 }
	 }

}
int kmp(const char* str,const char* sub, int pos)
{
	//str为主串,sub为子串
	assert(str && sub);
	int i = pos;
	int j = 0;
	int lenstr = strlen(str);
	int lensub = strlen(sub);
	int* next = (int*)malloc(sizeof(int) * lenstr);
	assert(next);
	Getnext(next,sub);
	while (i < lenstr && j < lensub)
	{
		if ((j == -1) || (sub[j] == str[i]))
		{
			//j == -1时next[0] = -1
			j++;
			i++;
		}
		else
		{
			j = next[j];
		}
	}
	free(next);
	if (j >= lensub)
	{
		return i - j;
	}
	return -1;

}

猜你喜欢

转载自blog.csdn.net/weixin_64448174/article/details/123653823
今日推荐