1.strlen模拟实现:
strlen函数的作用是求字符串长度,所以我们最先想到的方法就是找字符串的结尾,也就是'\0',由此,可以得到第一种方法:
(1)计数器法。
根据库函数中strlen的函数原型:size_tstrlen(constchar*string);我们可以设计一个计数器count,然后通过访问要计算的每一个字符,直到找到'\0'。然后返回count。
(2)递归法(不创建新变量法)
如果要求我们实现的时候不创建临时变量,我们可以考虑使用递归的方法,可以把需要计算的字符串看成一个字符+后面的子串的长度,即1+my_strlen(string+1);
(3)指针-指针法
除了上述两种方法外,我们之前学过,指针是可以进行加减运算的,指针-指针表示的就是两个指针之间的元素个数,因此我们可以使用字符串的'\0'处指针减去起始位置指针。
2. strcpy模拟实现
strcpy函数的作用是将字符串的内容拷贝到另一个字符串中,查找库函数得到strcpy函数原型为:char *strcpy( char *strDestination, const char *strSource );返回目的空间的首地址。我们可以将源里的数据按字符一个一个拷贝到目的空间,直到遇到'\0',此时下图代码中while循环中的循环条件是该赋值表达式的值,即0,跳出循环。
3.strncpy模拟实现
strncpy与strcpy的不同点就是需要自己决定要拷贝的字符个数,用来规避拷贝的源与目标空间发生重合时出现的未定义行为。因此strncpy的参数与strcpy也不相同。对于我们实现strncpy来说,就是循环停止的条件不同了。同时,要判断源字符串是否已经结束,如果结束,就在目标字符串后补0。
函数原型为:char *strncpy( char *strDest, const char *strSource, size_t count );
4.strcmp模拟实现
strcmp实现的原理是同时比较两个字符串中的第n个字符,如果相同,就比较下一对,直到遇到不同的或者是'\0',停止比较,返回两个字符的差值。
函数原型:intstrcmp(constchar*string1, constchar*string2);
5.strncmp模拟实现
strncmp与strcmp函数的不同在于控制了比较的字符数,
函数原型为intstrncmp(constchar*string1,constchar*string2,size_tcount);
因此,函数实现也就显而易见
6.strcat模拟实现
strcat函数的作用是追加字符串,那么实现原理和strcpy就很相似,但是需要提前找到strDestination的结尾处。
函数原型:char *strcat( char *strDestination, const char *strSource );
7.strncat模拟实现
strncat与strcat函数的差别和strcpy与strncpy的差别是相同的,就是限制了追加的字符串个数,查询的到函数原型为:char *strncat( char *strDest, const char *strSource, size_t count );
8.memcpy模拟实现
memcpy的作用就是可以拷贝任意数据类型,所有这时候我们为了让函数对任意数据类型都适用,就选择用泛型指针,因此查阅文献得到函数原型为:void *memcpy( void *dest, const void *src, size_t count );
9.memmove模拟实现
上面memcpy函数对于源和目标空间发生重合的情况是无法处理的,因此,我们引入了memmove函数用于处理这类情况。我们对遇到重合的情况,可以将重合分为两种情况而考虑。
第一种情况是源的地址在目标地址的右边
如果要将arr+3的数据拷贝到arr上时,应该将数据从前往后拷贝,先把4拷贝在1上,这样就不会使数据被覆盖。
第二种情况是源的地址在目标地址的左边
如果将arr的数据拷贝在arr+3上,就应该从要拷贝的最后一个数据开始拷贝,直到拷贝到起始位置。
10.memcmp模拟实现
memcmp函数的作用是逐字节的比较,那么实现原理与strcmp函数的原理应该是相似的,只是传入的类型值不同,memcmp使用了泛型指针,用于适应不同的数据类型。
函数原型:int memcmp( const void *buf1, const void *buf2, size_t count );