模拟实现strncpy、strncat 、strncmp

1. 模拟实现strncpy 
2.模拟实现strncat 
3.模拟实现strncmp

 

之前我也写过字符串模拟函数,对一个c语言中的库函数进行模拟,如果不细心的人今天就感觉这三个函数之前写过,但是实际上你仔细看就会发现这三个函数和之前的函数是有所不同的,在名字上就能看出这三个库函数在之前的函数名中加了一个n字母,其实总结的来说,这三个带n的库函数可以理解成这些库函数是对内存中的字节进行操作的。

Strncpychar * strncpy ( char * destination, const char * source, size_t num );

,把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回dest

Strncat char * strncat ( char * destination, const char * source, size_t num );

主要功能是在字符串的结尾追加n个字符

Strncmpint strncmp ( const char * str1, const char * str2, size_t num );

str1, str2 为需要比较的两个字符串,n为要比较的字符的数目。字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strncmp()首先将s1 第一个字符值减去s2 第一个字符值,若差值为0 则再继续比较下个字符,直到字符结束标志'\0',若差值不为0,则将差值返回。例如字符串"Ac""ba"比较则会返回字符"A"(65)'b'(98)的差值(-33)。注意:要比较的字符包括字符串结束标志'\0',而且一旦遇到'\0'就结束比较,无论n是多少,不再继续比较后边的字符。若str1str2的前n个字符相同,则返回0;若s1大于s2,则返回大于0的值;若s1 若小于s2,则返回小于0的值。

 

模拟实现strncpy

char *my_strncpy(char *dest, const char *src, int n)

{

assert(dest);

assert(src);

char *p = dest;

while (n--)

{

*p++ = *src++;

 

}

 

return dest;

}

模拟实现strncat

char *my_strncat(char *dest, const char *src, int n)

{

assert(dest);

assert(src);

char *p = dest;

while (*p!=0)

{

*p++;

 

}

while (n--)

{

*p++ = *src++;

}

*p = 0;

return dest;

}

模拟实现strncmp

int my_strncmp(const char *src1, const char *src2, int n)

{

assert(src1);

assert(src2);

while ((src1 != NULL) && (src2 != NULL) && (n != 0))

{

if ((*src1 - *src2) > 0)

return 1;

if ((*src1 - *src2) < 0)

return -1;

*src1++;

*src2++;

n--;

            

}

if (*src1 == 0)

return -1;

if (*src2 == 0)

return 1;

return 0;

}

 

#define _CRT_SECURE_NO_WARNINGS 1

 

 

#include<stdio.h>

#include<stdlib.h>

#include<assert.h>

 

char *my_strncpy(char *dest, const char *src, int n)

{

assert(dest);

assert(src);

char *p = dest;

while (n--)

{

*p++ = *src++;

 

}

 

return dest;

}

char *my_strncat(char *dest, const char *src, int n)

{

assert(dest);

assert(src);

char *p = dest;

while (*p!=0)

{

*p++;

 

}

while (n--)

{

*p++ = *src++;

}

*p = 0;

return dest;

}

 

int my_strncmp(const char *src1, const char *src2, int n)

{

assert(src1);

assert(src2);

while ((src1 != NULL) && (src2 != NULL) && (n != 0))

{

if ((*src1 - *src2) > 0)

return 1;

if ((*src1 - *src2) < 0)

return -1;

*src1++;

*src2++;

n--;

            

}

if (*src1 == 0)

return -1;

if (*src2 == 0)

return 1;

return 0;

}

int main()

{

char dest1[]="abcde";

char src1[] = "hello world";

char dest2[20] = "abcde";

char src2[] = "hello world";

int ret = 0;

my_strncpy(dest1, src1,3);

printf("%s\n", dest1);

printf("\n");

my_strncat(dest2, src2, 10);

printf("%s\n", dest2);

ret=my_strncmp(dest2, src2, 4);

printf("%d\n", ret);

system("pause");

return 0;

}

 

 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值