字符串函数和内存函数模拟实现

简介: 字符串函数和内存函数模拟实现

1.strlen模拟实现:


strlen函数的作用是求字符串长度,所以我们最先想到的方法就是找字符串的结尾,也就是'\0',由此,可以得到第一种方法:


(1)计数器法。

根据库函数中strlen的函数原型:size_tstrlen(constchar*string);我们可以设计一个计数器count,然后通过访问要计算的每一个字符,直到找到'\0'。然后返回count。

03330da808814b8797ea6d6bd516dbf9.png

(2)递归法(不创建新变量法)

如果要求我们实现的时候不创建临时变量,我们可以考虑使用递归的方法,可以把需要计算的字符串看成一个字符+后面的子串的长度,即1+my_strlen(string+1);

9fc12cae9bcf482c985c7fce30c62d1d.png

(3)指针-指针法

除了上述两种方法外,我们之前学过,指针是可以进行加减运算的,指针-指针表示的就是两个指针之间的元素个数,因此我们可以使用字符串的'\0'处指针减去起始位置指针。

3e7ca660d36e4a48b34612e484e0b898.png


2. strcpy模拟实现


strcpy函数的作用是将字符串的内容拷贝到另一个字符串中,查找库函数得到strcpy函数原型为:char *strcpy( char *strDestination, const char *strSource );返回目的空间的首地址。我们可以将源里的数据按字符一个一个拷贝到目的空间,直到遇到'\0',此时下图代码中while循环中的循环条件是该赋值表达式的值,即0,跳出循环。

b84e5c25327b4f439fb4c876f5d7d115.png


3.strncpy模拟实现


strncpy与strcpy的不同点就是需要自己决定要拷贝的字符个数,用来规避拷贝的源与目标空间发生重合时出现的未定义行为。因此strncpy的参数与strcpy也不相同。对于我们实现strncpy来说,就是循环停止的条件不同了。同时,要判断源字符串是否已经结束,如果结束,就在目标字符串后补0。


函数原型为:char *strncpy( char *strDest, const char *strSource, size_t count );

4db96423f4014288b0f85026d5fe6601.png


4.strcmp模拟实现


strcmp实现的原理是同时比较两个字符串中的第n个字符,如果相同,就比较下一对,直到遇到不同的或者是'\0',停止比较,返回两个字符的差值。

函数原型:intstrcmp(constchar*string1, constchar*string2);

7dbf249bb98241bc8f8076b3aff1f50f.png


5.strncmp模拟实现


strncmp与strcmp函数的不同在于控制了比较的字符数,

函数原型为intstrncmp(constchar*string1,constchar*string2,size_tcount);

因此,函数实现也就显而易见

7f4bce224b5940cc8cb9bbd95f6abac0.png


6.strcat模拟实现


strcat函数的作用是追加字符串,那么实现原理和strcpy就很相似,但是需要提前找到strDestination的结尾处。


函数原型:char *strcat( char *strDestination, const char *strSource );

9d902f2cf69a4606899b4ed2ee6a76ed.png


7.strncat模拟实现


strncat与strcat函数的差别和strcpy与strncpy的差别是相同的,就是限制了追加的字符串个数,查询的到函数原型为:char *strncat( char *strDest, const char *strSource, size_t count );

fe822654fa4b46d4ae5bd490c746071b.png


8.memcpy模拟实现


memcpy的作用就是可以拷贝任意数据类型,所有这时候我们为了让函数对任意数据类型都适用,就选择用泛型指针,因此查阅文献得到函数原型为:void *memcpy( void *dest, const void *src, size_t count );

d1e10912c4774e97b9bf8f67a318c0f1.png


9.memmove模拟实现


上面memcpy函数对于源和目标空间发生重合的情况是无法处理的,因此,我们引入了memmove函数用于处理这类情况。我们对遇到重合的情况,可以将重合分为两种情况而考虑。

第一种情况是源的地址在目标地址的右边

dc34f064ac6a413aaa520a381620cd05.png


如果要将arr+3的数据拷贝到arr上时,应该将数据从前往后拷贝,先把4拷贝在1上,这样就不会使数据被覆盖。

第二种情况是源的地址在目标地址的左边

如果将arr的数据拷贝在arr+3上,就应该从要拷贝的最后一个数据开始拷贝,直到拷贝到起始位置。

a017ac0bee354c10af04f1eba30795e9.png


10.memcmp模拟实现


memcmp函数的作用是逐字节的比较,那么实现原理与strcmp函数的原理应该是相似的,只是传入的类型值不同,memcmp使用了泛型指针,用于适应不同的数据类型。

函数原型:int memcmp( const void *buf1, const void *buf2, size_t count );

4be4755fa4964674995d173a5479c44d.png

目录
打赏
0
0
0
0
3
分享
相关文章
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
135 6
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
84 0
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
5月前
|
C语言 之 内存函数
C语言 之 内存函数
55 3
|
5月前
|
c语言回顾-内存操作函数
c语言回顾-内存操作函数
63 0
|
5月前
|
来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp
本文详细介绍了C语言中的四个内存操作函数:memcpy用于无重叠复制,memmove处理重叠内存,memset用于填充特定值,memcmp用于内存区域比较。通过实例展示了它们的用法和注意事项。
130 0
|
5月前
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
112 0
JVM实战—2.JVM内存设置与对象分配流转
本文详细介绍了JVM内存管理的相关知识,包括:JVM内存划分原理、对象分配与流转、线上系统JVM内存设置、JVM参数优化、问题汇总。
JVM实战—2.JVM内存设置与对象分配流转