文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

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

总结

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯