C语言函数模拟实现

目录

1.模拟实现strncat

1.1代码编写 

1.2结果如下

2.模拟实现strncpy

2.1代码编写

2.2结果如下

3.找单身狗

3.1代码编写

3.2结果如下


 

1.模拟实现strncat


在系统库函数中,存在strncat函数,它用于字符串的追加,就是在一个字符串后面追加一个字符串,它的函数原型为:

char *strncat(char *strDest,const *strSource,size_t count);

*strDest 为目标字符串 *strSource为源字符串,count为需要追加的字符串个数。

1.1代码编写 

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef unsigned int uint;
char *my_strncat(char *dest, const char *src, uint count)//模拟实现strncat函数
{
 assert(dest);
 assert(src);
 int *ret = dest;
 while (*dest)
 {
  dest++; //找到dest中的\0
 }
 while (count--)
 {
  *dest++ = *src++;
 }
 *dest = '\0';
 return ret;
}
//程序测试
int main()
{
 char arr[20] = "abcdef";
 int len = strlen(arr);
 my_strncat(arr, arr, len);
 printf("%s\n", arr);
 system("pause");
 return 0;
}

1.2结果如下

 


 

2.模拟实现strncpy

char *strncpy(char *strDest,const *strSource,size_t count);

*strDest 为目标字符串 *strSource为源字符串,count为需要将源字符串中字符拷贝到目标字符串的字符个数。 

注意:如果源字符串长度小于count,则拷贝完源字符串之后在目标字符串后面追加0,知道count个

2.1代码编写

char * My_strncpy(char * dest, const char *src, size_t n)
{
    assert(dest);
    assert(src);

    char *ret = dest;
    while (n--)
    {
        *dest++ = *src++;
    }
    return ret;
}
int main()
{
    char str1[20] = "123456789";
    char str2[20] = "abcde";
    printf("%s", My_strncpy(str1, str2, 3));

}

2.2结果如下

3.找单身狗

一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。

编写一个函数找出这两个只出现一次的数字。

3.1代码编写

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
void find_two_diff_num(int arr[], int sz, int *p1, int *p2)
{
	int i = 0;//循环变量
	int ret = 0;
	int pos = 0;
	*p1 = 0;//数字1的地址
	*p2 = 0;//数字2 的地址
	//1.把所有数字异或 
	for (i = 0; i < sz; i++)
	{
		ret ^= arr[i];//循环到最后一次的结果是5^6,即就是101^110=011
	}
	//2.找ret二进制中为1的一位
	for (i = 0; i < 32; i++)
	{
		if (((ret >> i) & 1) == 1)//上一步两个数异或的后两位为1
		{
			pos = i;
			break;
		}
	}
	//分组
	for (i = 0; i < sz; i++)
	{
		if (((arr[i] >> pos) & 1) == 1)
		{
			(*p1) ^= arr[i];
		}
	}
	(*p2) = (*p1) ^ ret;
}


int main()
{
	int arr[] = { 1, 2, 5, 6, 8, 1, 6, 2, 9, 8 };
	int sz = sizeof(arr) / sizeof(arr[0]);//数组大小
	int num1 = 0;//数字1
	int num2 = 0;//数字2
	find_two_diff_num(arr, sz, &num1, &num2);
	printf("num1=%d,num2=%d\n", num1, num2);
	system("pause");
	return 0;
}

3.2结果如下

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在C语言中,我们可以模拟实现memcpy函数。memcpy函数的原型为void * memcpy(void * destination, const void * source, size_t num),它的作用是将源地址(source)指向的内存块的数据拷贝到目标地址(destination)指向的内存块中,拷贝的字节数由第三个参数num指定。 要实现memcpy函数,我们可以按照以下步骤进行操作: 1. 首先,我们需要创建一个与源内存块相同大小的目标内存块,并将目标内存块的地址保存在destination指针中。 2. 接下来,我们使用一个循环来逐字节地将源内存块的数据复制到目标内存块中,直到拷贝的字节数达到了num的值。 3. 最后,我们返回目标内存块的地址(destination指针),作为函数的返回值。 下面是一个示例的实现代码: ```c void *my_memcpy(void *destination, const void *source, size_t num) { char *dest = (char *)destination; const char *src = (const char *)source; for (size_t i = 0; i < num; i++) { dest[i = src[i]; } return destination; } ``` 在这个实现中,我们将destination和source指针都转换为char类型的指针,这样可以逐字节地进行数据拷贝。然后,我们使用一个循环来逐字节地将源内存块的数据复制到目标内存块中,直到拷贝的字节数达到了num的值。最后,我们返回目标内存块的地址作为函数的返回值。 这样,我们就实现了一个简单的memcpy函数的模拟实现。需要注意的是,这只是一个简单的示例实现,实际的memcpy函数可能会有更复杂的实现方式,具体实现可能因编译器和操作系统的不同而有所差异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小孙的代码星球

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

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

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

打赏作者

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

抵扣说明:

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

余额充值