news 2026/4/29 10:23:32

一篇文章教你自己动手实现C语言库函数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一篇文章教你自己动手实现C语言库函数

函数作用

将num字节的值从source指向的位置复制到destination指向的内存块。复制就像使用了中间缓冲区一样进行,从而允许目标和源重叠。

该函数不检查source中是否有任何终止的空字符——它总是精确地复制num字节。

为了避免溢出,目标和源参数所指向的数组的大小必须至少为num字节。
返回destination。

实现memmove

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

#include <stdio.h>

#include <string.h>

#include <assert.h>

//实现memmove

void* my_memmove(void* dst,constvoid* src,size_tn)

{

assert(dst && src);

char* dst_temp = (char*)dst;

char* src_temp = (char*)src;

if(src_temp<dst_temp && src_temp + n>dst_temp)//src在dst前,两者交错,需从后往前复制

{

while(n)

{

*(dst_temp + n - 1 )= *(src_temp + n - 1);

n--;

}

}

else

{

while(n--)

{

*dst_temp++ = *src_temp++;

}

}

returndst;

}

intmain()

{

inta[10] = { 0,1,2,3,4,5,6,7,8,9 };

my_memmove(a+2, a, 4*sizeof(int));

for(inti = 0; i < 10; ++i)

{

printf("%d ", a[i]);

}

return0;

}

memcpy

函数声明

1

void*memcpy(void* destination,constvoid* source,size_tnum );

函数作用

将num个字节的值从source所指向的位置开始直接复制到destination所指向的内存块。

该函数不检查source中是否有任何终止的空字符——它总是精确地复制num字节。

为了避免溢出,目标和源参数所指向的数组的大小必须至少为num字节,并且不能重叠(对于重叠的内存块,memmove是一种更安全的方法)。
返回destination。

实现memcpy

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

//实现memcpy

void* my_memcpy(void* dst,constvoid* src,size_tn)

{

assert(dst && src);

char* dst_temp = (char*)dst;

char* src_temp = (char*)src;

while(n--)

{

*dst_temp++ = *src_temp++;

}

returndst;

}

intmain()

{

inta[10] = { 0,1,2,3,4,5,6,7,8,9 };

my_memcpy(a+2, a, 4*sizeof(int));

for(inti = 0; i < 10; ++i)

{

printf("%d ", a[i]);

}

return0;

}

重叠的区间将会被提前破坏。

strstr

函数声明

1

char*strstr(char* str1,constchar* str2 );

函数作用

查找子字符串

返回一个指向str1中第一次出现的str2的指针,如果str2不是str1的一部分,则返回一个空指针。

匹配过程不包括结束空字符,但它在此停止。

实现strstr

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

/实现strstr

char* my_strstr(constchar* mom,constchar* son)

{

char* cp=mom;

char* i, *j;

if(*son =='\0')

{

returnmom;

}

while(*cp !='\0')

{

i = cp;

j = son;

while(i && *i == *j)

{

i++;

j++;

if(*j =='\0')

returncp;

}

cp++;

}

returnNULL;

}

intmain()

{

charmom[] ="abcdefghijk";

charson[] ="ghi";

printf("%s\n",my_strstr(mom, son));

return0;

}

strcat

函数声明

1

char* strstr (char* str1,constchar* str2 );

函数作用

连接字符串

将source字符串的副本粘贴追加到目标字符串。destination中的结束空字符被source中的第一个字符覆盖,并且在由destination中的两个字符串联形成的新字符串的末尾包含一个空字符。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 10:21:29

游戏服务器架构中的分区策略负载均衡与数据同步

游戏服务器架构中的分区策略、负载均衡与数据同步 在大型多人在线游戏&#xff08;MMO&#xff09;或开放世界游戏中&#xff0c;服务器架构的设计直接影响玩家的体验。随着玩家数量的增长&#xff0c;如何高效分配服务器资源、平衡负载并确保数据一致性成为关键挑战。分区策略…

作者头像 李华
网站建设 2026/4/29 10:19:56

1 7.3 在 Windows 11 中使用无线网卡

&#x1f525;个人主页&#xff1a;杨利杰YJlio❄️个人专栏&#xff1a;《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》&#x1f31f; 让复杂的事情更…

作者头像 李华
网站建设 2026/4/29 10:09:39

w64devkit:Windows平台C/C++开发的终极便携工具包完全指南

w64devkit&#xff1a;Windows平台C/C开发的终极便携工具包完全指南 【免费下载链接】w64devkit Portable C and C Development Kit for x64 (and x86) Windows 项目地址: https://gitcode.com/gh_mirrors/w6/w64devkit 你是否曾经因为Windows上复杂的C/C开发环境配置而…

作者头像 李华