库函数的实现(二)

1.memcpy函数

memcpy函数与strncpy不同的是memcpy可以对整形数组进行拷贝而strncpy只能对字符数组拷贝。

下面实现将“7,8,9”取代arr1中的“0,1,2”。

void*my_memcpy(void* str1, const void* str2, size_t num)
{
	void* ret = str1;
	assert(str1 && str2);
	while (num--)
	{
		*(char*)str1 = *(char*)str2;
		str1 = (char*)str1 + 1;
		str2 = (char*)str2 + 1;
	}
	return ret;
}
int main()
{
	int arr1[] = { 0,1,2,3,4,5,6 };
	int arr2[] = { 7,8,9,10 };
	my_memcpy(arr1, arr2,3*sizeof(int));
	for (int i = 0; i < sizeof(arr1) / sizeof(arr1[0]); i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

因为memcpy数组是以字节为单位拷贝的所以函数中要将它强制转化为字符类型,字符的单位为字节。

2.strncat函数

它与strcat函数类型差不多只是多了可以加拷贝的个数所以它的参数为三个。

下面实现将“world!”追加到arr1数组后面。

char* my_strncat(char* str1, const char* str2, size_t num)
{
	assert(str1 && str2);
	while (*str1)
	{
		str1++;
	}
	while (num--)
	{
		*str1++ = *str2++;
	}
	*str1 = '\0';
	return str1;
}



int main()
{
	char arr1[100] = "hello ";
	char arr2[] = "world! and hello offers!";
	char* n = my_strncat(arr1, arr2, 6);
	printf("%s\n", arr1);
	return 0;
}

3.strncpy函数的实现

strncpy与strcpy类型差不多,都属于拷贝字符串的,但strncpy可以拷贝任意个数的字符串,所以strncpy有三个参数。

下面是实现将arr2中的“he”拷贝到arr1上

char*my_strncpy(char* str1, const char* str2, size_t num)
{
	int i = 0;
	for (i = 0; str2[i] != '\0' && i < num; i++)
	{
		str1[i] = str2[i];
	}
	if (i < num)
	{
		str1[i] = '\0';
	}
	return str1;
}
int main()
{
	char arr1[100] = { 0 };
	char arr2[] = "hello world!";
	char *n=my_strncpy(arr1, arr2, 2 );
	printf("%s\n", arr1);
	return 0;
}

其中可以用指针代替数组的形式

4.memmove函数

memmove函数用来实现两个或者一个整形字符的拷贝与strncpy不同与strncpy只能拷贝字符串

下面是实现自己拷贝自己从arr[2]中为起始位置拷贝1,2,3,4,5,其中单位为字节

void* my_memmove(void* dest, void* src, size_t num)
{
	if (dest > src)
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest=(char*)dest+1;
			src=(char*)src+1;
		}
	}
	else
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr + 2, arr, 5 * sizeof(int));
	return 0;
}

5.strstr函数

strstr为string string是在一个字符串中寻找另外一个字符串,如果寻找的字符串为空字符串则返回原字符串。

下面是实现在arr1中寻找arr2

 const char* my_strstr(const char* str1, const char* str2)
{
	 assert(str1 && str2);
	 const char* s1 = str1;
	 const char* s2 = str2;
	 const char* cur = str1;
	 if (*str2 =='\0')
	 {
		 return str1;
	 }
	 while (*cur)     //cur是来找字符的每次找完结尾都加一
	 {
		 s1 = cur;
		  s2 = str2;
		 while (*s1 && *s2 && *s1 == *s2)
		 {
			 s1++;
			 s2++;

		 }
		 if (*s2 == '\0')
		 {
			 return cur;
		 }
		 cur++;
	 }
	 return NULL;
}


int main()
{
	char arr1[] = "abbbcde";
	char arr2[] = "bbc";
	const char *n = my_strstr(arr1, arr2);
	if (n == NULL)
	{
		printf("没找到");
	}
	else
	{
		printf("找到了,%s\n", n);
	}
	return 0;
}

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在C++中,库函数(也称为标准库函数或内置函数)并没有直接提供用于实现掩码操作的函数,因为掩码通常涉及到位操作,这是C++语言底层提供的。掩码操作主要是用来处理进制数据,比如位与(&)、位或(|)、位异或(^)、左移(<<)和右移(>>)等操作。 以下是一些基本的位操作: 1. **位与(&)**:如果两个对应位置都是1,则结果为1,否则为0。这对于设置或清除特定的位非常有用,例如掩码操作就是利用这一点。 2. **位或(|)**:如果两个对应位置有一个是1,则结果为1。通常用于设置位。 3. **位异或(^)**:如果两个对应位置不相同,则结果为1。可以用于清除位或设置为相反的状态。 4. **左移(<<)**:将进制位向左移动指定的位数,最右边的空位用0填充。 5. **右移(>>)**:将进制位向右移动指定的位数,最左边的位用符号位填充(对于有符号整数)或0填充(对于无符号整数)。 如果你需要更复杂的掩码操作,可能需要自定义函数或者使用模板函数、位字段(bitfields)或者其他编程技巧来实现。例如,你可以创建一个函数,接受一个掩码值和一个原始值作为参数,然后返回按掩码操作后的结果。 ```cpp template <typename T> T applyMask(T value, T mask) { return value & mask; } // 示例: int original = 0b10101010; // 原始值 int mask = 0b11001100; // 掩码 int maskedValue = applyMask(original, mask); // 结果: 0b10001000 ``` 如果你具体想要了解关于掩码的某个概念或者如何在特定场景下使用,请详细描述你的需求,我会给出更具体的指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

剴415

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值