提升内功之模拟实现库函数strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove

这篇具有很好参考价值的文章主要介绍了提升内功之模拟实现库函数strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


strlen

提升内功之模拟实现库函数strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove,c语言,# 知识点,c语言

strlen函数的作用就是求字符串的首元素开始往后计算字符串的长度,直到’\0‘,但不会把\0的长度计算进去

#include<stdio.h>

size_t Strlen(const char* src)
{
	size_t count = 0;
	while (*src != '\0')
	{
		src++;
		count++;
	}
	return count;
}

int main()
{
	char arr[] = "abcdef";
	printf("%zd", Strlen(arr));
	return 0;
}

提升内功之模拟实现库函数strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove,c语言,# 知识点,c语言


strncpy

提升内功之模拟实现库函数strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove,c语言,# 知识点,c语言

strncpy的作用就是从source指向的字符串复制num个字节的内容到destination指向的字符串去
如果source的长度小于num,则填充0
注意source和destination的内容在空间上不要重叠,如要进行重叠空间内容的拷贝,则参考后续的memmove

#include<stdio.h>


size_t Strlen(const char* src)
{
	size_t count = 0;
	while (*src != '\0')
	{
		src++;
		count++;
	}
	return count;
}


char* Strncpy(char* dest, const char* src, size_t num)
{
	char* ret = dest;
	size_t len = Strlen(src);


	if (len >= num)
	{
		while (num--)
		{
			*dest++ = *src++;
		}
	}
	else
	{
		int tmp = num - len;
		while (len--)
		{
			*dest++ = *src++;
		}
		while (--tmp > 0)
		{
			*dest++ = '\0';	
		}
	}
	*dest = '\0';
	return ret;
}

提升内功之模拟实现库函数strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove,c语言,# 知识点,c语言


strcmp

提升内功之模拟实现库函数strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove,c语言,# 知识点,c语言

strcmp函数的作用是比较两个字符串,str1小于str2返回小于0的数字,相等返回0.大于则返回大于0的数字
vs中一般是返回1、0、-1

#include<stdio.h>
#include<assert.h>


//c++可以用函数重载把strcmp和strncmp实现在一起
int Strcmp(const char* arr1,const char* arr2)
{
	assert(arr1 && arr2);
	while (*arr1 != '\0' && *arr2 != '\0' && *arr1 == *arr2)
	{
		arr1++;
		arr2++;
	}
	if (*arr1 != '\0' && *arr2 != '\0' && *arr1 > *arr2)
	{
		return 1;
	}
	else if (*arr1 != '\0' && *arr2 != '\0' && *arr1 < *arr2)
	{
		return -1;
	}
	else if (*arr1 == '\0' && *arr2 == '\0')
	{
		return 0;
	}
	else
	{
		if (*arr1 != '\0' && *arr2 == '\0')
		{
			return 1;
		}
		else
		{
			return -1;
		}
	}
	//	assert(str1 && str2);
	//
	//	while (*str1 == *str2)
	//	{
	//		if (*str1 == '\0')
	//			return 0;
	//
	//		str1++;
	//		str2++;
	//	}
	//
	//	return (*str1 - *str2);
}




int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abc";
	char arr3[] = "abcdefg";
	char arr4[] = "abd";
	char arr5[] = "abb";
	printf("%d\n", Strcmp(arr1, arr2));
	printf("%d\n", Strcmp(arr1, arr3));
	printf("%d\n", Strcmp(arr1, arr3));
	printf("%d\n", Strcmp(arr1, arr4));
	printf("%d\n", Strcmp(arr1, arr5));
	return 0;
}

提升内功之模拟实现库函数strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove,c语言,# 知识点,c语言


strcat

提升内功之模拟实现库函数strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove,c语言,# 知识点,c语言

strcat函数的作用就是在destination指向的字符串后面追加上sourse指向的字符串
source和destination指向的字符串也不能重叠

#include<stdio.h>
#include<assert.h>


char* Strcat(char* arr1,const char* arr2)
{
	assert(arr1 && arr2);


	char* ret = arr1;
	while (*arr1 != '\0')
	{
		arr1++;
	}
	while (*arr1++ = *arr2++)
	{
		;
	}
	return ret;
}


int main()
{
	//如果这里我不提前给arr1一个20的初始空间的话
	//编译器自动赋值成6,追加之后arr1长度会超出范围
	char arr1[20] = "abcdef";
	char arr2[] = "ghi";
	printf("%s", Strcat(arr1, arr2));
	return 0;
}

提升内功之模拟实现库函数strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove,c语言,# 知识点,c语言


strstr

提升内功之模拟实现库函数strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove,c语言,# 知识点,c语言

strstr函数的作用就是在str1指向的字符串中找到str2指向的字符串第一次在str1指向的字符串中出现的位置

#include<stdio.h>
#include<assert.h>


size_t Strlen(const char* src)
{
	size_t count = 0;
	while (*src != '\0')
	{
		src++;
		count++;
	}
	return count;
}


char* strstr(const char* arr1, const char* arr2)
{
	assert(arr1 && arr2);


	char* ret = arr1;
	char* p1 = ret;
	char* p2 = arr2;
	size_t len1 = Strlen(arr1);
	size_t len2 = Strlen(arr2);


	while (*(ret + len2) != '\0')
	{
		if (*ret != *p2)
		{
			ret++;
			len1--;
		}
		if (len1 > 0)
		{
			p1 = ret;
		}
		else
		{
			return NULL;
		}


		while (*p1 == *p2)
		{
			p1++;
			p2++;
		}
		if (*p2 == '\0')
		{
			return ret;
		}
		ret++;
		p1 = ret;
		p2 = arr2;
	}
}


int main()
{
	char arr1[] = "abbbcbcf";
	char arr2[] = "bbc";
	char arr3[] = "bbbb";
	char arr4[] = "xyz";
	printf("%s\n", strstr(arr1, arr2));
	printf("%s\n", strstr(arr1, arr3));
	printf("%s\n", strstr(arr1, arr4));
	return 0;
}

提升内功之模拟实现库函数strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove,c语言,# 知识点,c语言


memcpy

提升内功之模拟实现库函数strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove,c语言,# 知识点,c语言

memcpy是内存块拷贝,是更精确的拷贝函数,并且可以针对各种类型的变量(strcpy只针对字符串)
source和destination指向的空间不应该重叠(重叠的考虑memmove)

#include<stdio.h>
#include<assert.h>


void* Memcpy(void* arr1,const void* arr2, int num)
{
	void* ret = arr1;
	assert(arr1 && arr2);
	while (num--)
	{
		*((char*)arr1+num) = *((char*)arr2 + num);
	}
}


int main()
{
	int arr1[20] = { 0 };
	int arr2[] = { 1,2,3,4,5,6,7,8,9 };
	Memcpy(arr1, arr2, 4 * sizeof(arr2[0]));
	return 0;
}

提升内功之模拟实现库函数strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove,c语言,# 知识点,c语言


memmove

提升内功之模拟实现库函数strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove,c语言,# 知识点,c语言

加强版memcpy,可以拷贝空间上重叠的内容

#include<stdio.h>
#include<assert.h>


void* Memmove(void* arr1,const void* arr2, int num)
{
	void* ret = arr1;
	assert(arr1 && arr2);


	if (arr1 < arr2)
	{
		while (num--)
		{
			*((char*)arr1) = *((char*)arr2);
			++(char*)arr1;
			++(char*)arr2;
		}
	}
	else
	{
		while (num--)
		{
			*((char*)arr1 + num) = *((char*)arr2 + num);
		}
	}
}


int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9 };
	Memmove(arr1+4, arr1, 4 * sizeof(arr1[0]));
	return 0;
}

提升内功之模拟实现库函数strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove,c语言,# 知识点,c语言文章来源地址https://www.toymoban.com/news/detail-563224.html

到了这里,关于提升内功之模拟实现库函数strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c语言练习41:深入理解字符串函数strlen strcpy strcat

    模拟实现:”strlen   strcpy   strcat strlen   strcat:

    2024年02月09日
    浏览(50)
  • 【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)&&三种strlen模拟实现

    🔍个人主页 : @啊森要自信的主页 ✏️ 真正相信奇迹的家伙,本身和奇迹一样了不起啊! 欢迎大家关注🔍点赞👍收藏⭐️留言📝希望看完我的文章对你有小小的帮助,如有错误,可以指出,让我们一起探讨学习交流,一起加油鸭。 本小节我们将学习字符分类函数,字符

    2024年02月04日
    浏览(55)
  • 【模拟实现】探索strlen:三种方法实现

    目录 一、strlen函数的介绍 二、三种模拟实现 strlen 的方法 (1)计数式 a.完整代码 b.思路解析 c.个人分析 (2)递归解法 a.完整代码 b.思路解析 (3)指针减指针 a.完整代码 b.思路解析 大家好,我是小蔡,下午在刷题的时候发现到自己对于 模拟实现库函数 这方面有些许薄弱,现

    2023年04月13日
    浏览(29)
  • 【C语言】超详解strncpy&&strncat&&strncmp&&strerror&&perror的使⽤和模拟实现

    🔍个人主页 : @啊森要自信的主页 ✏️ 真正相信奇迹的家伙,本身和奇迹一样了不起啊! 欢迎大家关注🔍点赞👍收藏⭐️留言📝希望看完我的文章对你有小小的帮助,如有错误,可以指出,让我们一起探讨学习交流,一起加油鸭。 本小节,阿森继续和你一起学习5个字符

    2024年02月04日
    浏览(43)
  • C++面试八股文:如何实现一个strncpy函数?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第31面: 面试官: strcpy 函数使用过吧? 二师兄:用过。 面试官:这个函数有什么作用? 二师兄:主要用做字符串复制,将于字符从一个位置复制到另一个位置。 面试官: strncpy 函数也使用过吧,和 strcpy 有何不同? 二师兄:

    2024年02月11日
    浏览(53)
  • C语言-----函数功能实现---strcpy&&strlen

    1 .函数功能参数介绍 该函数的功能就是把一个字符串复制到另外的一个数组,包括\\\'\\0\\\'; 2.首先我们要明确字符串的复制也是包括最后的\\0的; 跳出while循环之后就会把末尾的\\0实现复制; 3.继续优化---------------------------------------------- 我们阅读上面的资料就会发现strcpy的返回

    2024年02月20日
    浏览(37)
  • 【C语言】自定义实现strlen函数的3种方法

    大家好,我是苏貝,本篇博客带大家了解C语言中自定义实现strlen函数的3种方法,如果大家觉得我写的不错的话,可以给我一个赞👍吗,感谢❤️ 函数原型 :size_t strlen( const char string ); //求string的长度 头文件 :#includestring.h 返回值 :返回的是第一个目的数字的首地址,类型为

    2024年02月13日
    浏览(38)
  • 【Linux操作系统】Linux系统编程实现递归遍历目录,详细讲解opendir、readdir、closedir、snprintf、strcmp等函数的使用

    在Linux系统编程中,经常需要对目录进行遍历操作,以获取目录中的所有文件和子目录。递归遍历目录是一种常见的方法,可以通过使用C语言来实现。本篇博客将详细介绍如何使用C语言实现递归遍历目录的过程,并提供相应的代码示例,同时解释相关函数的使用。 1.1.1 函数

    2024年02月12日
    浏览(38)
  • 【C++中的strcmp函数】

    在C++中,字符串比较是一项常见的操作,用于判断两个字符串是否相等或者大小关系。 strcmp 函数是C++标准库中用于字符串比较的重要函数。 strcmp 函数用于比较两个字符串的大小关系。它的原型如下: str1 和 str2 :要进行比较的两个字符串。 strcmp 函数会按照字典顺序逐个比

    2024年02月08日
    浏览(31)
  • C语言strcat函数再学习

    之前学习了strcat函数;下面继续学习此函数; 它的功能描述是, 功能 把src所指向的字符串(包括“\\0”)复制到dest所指向的字符串后面(删除*dest原来末尾的“\\0”)。要保证*dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针。 说明 src和dest所

    2024年02月05日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包