0
点赞
收藏
分享

微信扫一扫

模拟实现库函数&内存函数

您好 2022-04-05 阅读 30
c语言

C 语言中对字符和字符串的处理很是频繁,但是 C 语言本身是没有字符串类型的,字符串通常放在

常量字符串 中或者 字符数组 中。

字符串常量 适用于那些对它不做修改的字符串函数 .

字符操作函数

strlen  求字符串长度

strlen注意事项

模拟实现strlen(三种) 

strcpy   字符串拷贝

strcpy注意事项

strcpy模拟实现

strcat    字符串追加

strcat注意事项

strcat模拟实现 

strcmp  字符串的比较大小

strcmp的注意事项

strcmp模拟实现 


以上几种函数是长度不受限制的字符串函数 ,一旦字符串没有足够的空间,函数仍然敢进行操作,这时候就已经造成了非法访问,使程序崩溃,但依然会运行出结果。下面引进长度受限制的三种函数

strncpy    有长度限制的字符拷贝

strncat   有限制的字符串追加

strncmp  有限制的字符比较 

 

strstr  找字符串的子集

strstr模拟实现 

strtok 分隔

 strerror 返回错误码对应的错误信息


字符分类函数 如果他的参数符合下列条件就返回真


内存操作函数

memcpy     将arr1 拷贝 到 arr2

memcpy模拟实现 

memmove 重叠拷贝

memmove应用

int main()
{
	

	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	              // 1 2 1 2 3 4 5 8 9 10
	memcpy(arr1+2, arr1, 20);
    int i = 0;
	int sz = sizeof(arr1) / sizeof(arr1[0]);

	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr1[i]);
	}

	return 0;
}

 memmove模拟实现

首先分析拷贝顺序

将src内容拷贝到dest里面,当dest位于src左边时,从前往后拷贝,即先拷贝3-->2  4-->3  5-->4 

#include<stdio.h>

void* my_memmove(void* dest, const void* src, size_t count)
{
	assert(dest && src);
	void* ret = dest;
	//1
	if (dest < src)
	{
		//前->后
		while (count--)
		{
			* (char*)dest = * (char*)(src);
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		//后->前
		while (count--)
		{
			*((char*)dest + count) = *((char*)src + count);
		}
	}

	return ret;
}
	int main()
{

	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	              // 1 2 1 2 3 4 5 8 9 10
	memcpy(arr1+2, arr1, 20);

	my_memmove(arr1+2, arr1, 20);//可以实现重叠内存的拷贝
	//my_memmove(arr1, arr1+2, 20);//可以实现重叠内存的拷贝

	int i = 0;
	int sz = sizeof(arr1) / sizeof(arr1[0]);

	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr1[i]);
	}

	return 0;

memcp  字符内存比较

细化到每个字节进行比较,前17个字节一样。有没有\0仍然会继续比较。 

memset   设置内存空间

 

 

举报

相关推荐

0 条评论