仿写C语言string.h头文件检验字符串函数

 更新时间:2021年11月12日 11:58:14   作者:code-016  
这里给大家分享的是一个C语言string.h头文件检验字符串函数的仿写,非常的简单实用,小编觉得这篇文写的还不错,希望能够给你带来帮助

c语言string.h头文件字符串检验函数仿写

所需头文件:stdio.h ,stdlib.h, string.h

strlen字符串求长度

int strlen_my(const char* src_str)
{
 	if (NULL == src_str)
	{
		return -1;
	}
	const char* p = src_str;
	while (*p != '\0')
	{	
		p++;
	}
	return p - &(src_str[0]);
}
//递归
int strlen_my2(const char* src_str)
{
	if (src_str == NULL)
		return -1;
	if (*src_str)
	{
		return strlen_my2(src_str + 1) + 1;
	}
	else
	{
		return 0;
	}
}
 int main()
{
	const char* p = "hello";
	printf("%d \n",strlen_my(p));
	return 0;
}

strcmp / strncmp字符串比较

int strcmp_my(const char* str_a, const char* str_b)
{
	while ((*str_a != '\0' || *str_b != '\0') && *str_a == *str_b )
	{
		str_a++;
		str_b++;
	}
 	return *str_a - *str_b > 0 ? 1 : (*str_a - * str_b < 0 ? -1 : 0);
}
int strcmp_my2(const char* str_a, const char* str_b)
{
	int sub = 0;
	while ((sub = *str_a - *str_b) == 0 && *str_a++ && *str_b++);	//先赋值,指针再++
 	return sub > 0 ? 1 : (sub < 0 ? -1 : 0);
}
 int strncmp_my(const char* str_a, const char* str_b, size_t front_len)
{
	while (--front_len && *str_a != '\0' && *str_b != '\0' 
		&& *str_a == *str_b)
	{
		str_a++;
		str_b++;
	}
 	return *str_a - *str_b > 0 ? 1 : (*str_a - *str_b < 0 ? -1 : 0);
}
 int main()
{
	const char* p = "hella";
	const char* q = "hell";
	printf("%d \n", strncmp_my(p, q, 4));
	return 0;
}

strchr / strrchr 字符串中查找字符ch

第一个出现的字符ch

//strchr 返回字符串中第一个出现的字符ch
char* strchr_my(const char* src_str, char ch)
{
	if (src_str == NULL)
	{
		return NULL;
	}
 	while (*src_str != '\0' && *src_str != ch)
	{
		src_str++;
	}
 	return *src_str == '\0' ? NULL : src_str;
}
 int main()
{
	const char* p = "hello";
	p = strchr_my(p, 'e');
	if (p == NULL)
		return 0;
	printf("%c\n", *p);
}
 

最后一个出现的字符ch

//strrchr查找字符串中最后一个出现的字母ch
char* strrchr_my(const char* src_str, char ch)
{
	if (NULL == src_str) return NULL;
	const char* p = src_str + strlen(src_str) - 1;
 	while ((p - src_str) >= 0 && *p != ch)
	{
		p--;
	}
	if (p - src_str == -1)
	{
		return NULL;
	}
	return p;
}
 int main()
{
	const char* p = "hello";
	//p = strchr_my(p, 'q');
 	p = strrchr_my(p, 'l');
	if (p == NULL)
		return 0;
	printf("%c\n", *p);
}
 

strstr 字符串匹配:src_str中查找des_str,返回匹配的起始位置,没有为NULL(BF算法)

char* strstr_my(const char* src_str, const char* des_str)
{
	if (NULL == src_str || NULL == des_str)
	{
		return NULL;
	}
 	int len_src = strlen(src_str);
	int len_des = strlen(des_str);
	int i = 0;	//src_str
	int j = 0;	//des_str
 	while (i < len_src && j < len_des)
	{
		if (src_str[i] == des_str[j])
		{
			i++;
			j++;
		}
		else
		{
			i = i - j + 1;
			j = 0;
		}
	}
 	if (j == len_des)
	{
		return src_str + i - j;
	}
	return NULL;
}
 int main()
{
	const char* p = "hello";
	const char* q = "llo";
	const char* rt = strstr_my(p, q);
	if (rt != NULL)
	{
		printf("%s\n", rt);
		return 0;
	}
	return 0;
}

strcpy / strncpy字符串拷贝

char* strcpy_my(char* des_str, const char* src_str)
{
	if (des_str == NULL || src_str == NULL)
		return NULL;
	char* p = des_str;
	while (*src_str != '\0')
	{
		*p++ = *src_str++;
	}
	*p = '\0';
	return des_str;
}
 char* strncpy_my(char* des_str, const char* src_str, size_t len)
{
	if (des_str == NULL || src_str == NULL || len <= 0)
		return NULL;
	char* p = des_str;
	//源字符串实际长度
	int cur_len = strlen(src_str) <= len ? len : strlen(src_str);
 	while (cur_len--)
	{
		*p++ = *src_str++;
	}
	*p = '\0';
	return des_str;
}
 int main()
{
	const char* p = "hello";
	char q[10] = {0};
 	if (strncpy_my(q, p, 1) != NULL)
	{
		printf("%s\n", q);
	}
 	return 0;
}

strcat / strncat字符串的粘贴

char* strcat_my(char* des_str, const char* src_str)
{
	if (des_str == NULL || src_str == NULL)
		return NULL;
	int len_des = strlen(des_str);
	char* p = des_str + len_des;
 	while (*src_str != '\0')
	{
		*p++ = *src_str++;
	}
	return des_str;
}
 char* strncat_my(char* des_str, const char* src_str, size_t len)
{
	if (des_str == NULL || src_str == NULL || len < 0)
		return NULL;
	int len_des = strlen(des_str);
	char* p = des_str + len_des;
 
	while (len--)
	{
		*p++ = *src_str++;
	}
	return des_str;
}
 int main()
{
	char p[20] = "hello";
	const char* q = "world";
	printf("p = %s\n", p);
	printf("q = %s\n", q);
	if (strncat_my(p, q, 3) != NULL) 
	{
		printf("p = %s\n", p);
	}
	printf("q = %s\n", q);
	return 0;
}

strdup 字符串申请堆区空间存放字符串的副本

char* strdup_my(const char* src_str)
{
	if (NULL == src_str)
		return NULL;
	char* newspace = (char*)malloc((strlen(src_str) + 1 ) * sizeof(char));
	if (newspace == NULL)
		return NULL;
	int i = 0;
	while (*src_str != '\0')
	{
		newspace[i++] = *src_str++;
	}
	newspace[i] = '\0';
	return newspace;
}
int main()
{
	const char* p = "hello";
	char* q = strdup_my(p);
	if (q != NULL)
	{
		printf("%s\n", q);
		free(q);
		q == NULL;
	}
	return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • 深入线性时间复杂度求数组中第K大数的方法详解

    深入线性时间复杂度求数组中第K大数的方法详解

    本篇文章是对线性时间复杂度求数组中第K大数的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++ 实现的通讯录管理系统详解

    C++ 实现的通讯录管理系统详解

    这篇文章主要为大家详细介绍了C++实现通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 教你用c++从头开始实现决策树

    教你用c++从头开始实现决策树

    从头实现一个分类决策树分类器似乎是一个适当的挑战。这已经被证明是一个测试但有益的学习旅程,我想分享一些我在这个过程中的主要经验,对c++实现决策树相关知识感兴趣的朋友一起看看吧
    2021-05-05
  • C语言的fork函数在Linux中的进程操作及相关面试题讲解

    C语言的fork函数在Linux中的进程操作及相关面试题讲解

    fork函数只能在类Unix的系统中使用,用于创建子线程,这里总结了C语言的fork函数在Linux中的进程操作及相关面试题讲解,先来看一下C语言程序的存储空间与进程示意:
    2016-06-06
  • C++入门教程详解之命名空间、函数重载、缺省参数

    C++入门教程详解之命名空间、函数重载、缺省参数

    这篇文章主要介绍了C++入门教程详解之命名空间、函数重载、缺省参数,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • VScode+cuda编程常见环境问题的解决

    VScode+cuda编程常见环境问题的解决

    本文主要介绍了VScode+cuda编程常见环境问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • C++ 实现对象池的具体方法

    C++ 实现对象池的具体方法

    本文主要介绍了C++ 实现对象池的具体方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 浅谈C语言Free空指针会怎样

    浅谈C语言Free空指针会怎样

    在C语言中,使用free函数释放一个空指针是安全的,不会引发任何错误或异常,本文就来详细的介绍一下,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • Clion-MinGW编译后的exe文件添加ico图标的操作方法

    Clion-MinGW编译后的exe文件添加ico图标的操作方法

    这篇文章主要介绍了Clion-MinGW编译后的exe文件添加ico图标的操作方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • 详解C++中普通旧数据(POD)的使用

    详解C++中普通旧数据(POD)的使用

    普通旧数据就是内存中的连续字节序列,是能够被“仅当作数据”处理的对象。这篇文章主要带大家了解一下C++中普通旧数据的定义与使用,感兴趣的可以了解下
    2023-03-03

最新评论