【C语言】模拟实现strncpy、strncat、strncmp函数

strncpy、strncat、strncmp函数与strcpy、strcat、strcmp函数非常相近,在实现功能上也十分接近。但是在“str…”函数里,它是用自身的字符数组长度来判断循坏的停止条件,在一些情况下这是不安全的,比如在strcat函数,我们给arr追加arr时,程序就会崩溃。所以,用自身的长度来作为循环停止条件是不安全的。

于是出现了这么一群“strn…”函数,它们在函数拷贝的过程中,将‘\0’也拷贝出来,并且以‘\0’作为循环的终止条件,这样子就会避免程序找不到结束条件,自己崩溃的现象。所以,在这种情况,代码和之前实现那几个函数在大的模块上几乎没有什么改动,在判断条件上需要判断。

1.strncpy

char* my_strncpy(char *des,const char *src,int count)
{
 char *cp=des;
 assert(src && des);
 while(count && (*des++=*src++))
 {
   count--;
 }
 if(count>0)
 {
     while(--count)
     {
       *des++='\0';
     }
 }
 return cp;
}

int main()
{
   char string[80]={0};
   int len=strlen("hello");
   printf( "String = %s\n", my_strncpy(string,"Hello",len));
   system("pause");
   return 0;
}

这里写图片描述

2.strncat

char* strncat(char *des,const char *src,int count)
{
 char *cp=des;
 assert(src && des);
 while(*des!='\0')
 {
  *dest++;
 }
 while(count && *src)
 {
  *des++=*src++;
  count--;
 }
 *des='\0';
 return cp;
}

int main()  
{  
    char arr[20] = "hello";  
    int len = strlen(arr);  
    char *ret = my_strncat(arr,arr, len);  
    printf("%s", ret);  
    system("pause");  
    return 0;  
}  

这里写图片描述

3.strncmp

int my_strncmp(const char *arr1,const char *arr2,int count)
{
  assert(arr1 && arr2);
  while(count && (*arr1==*arr2))
  {
    if(arr1=='\0')
     return 0;
    arr1++;
    arr2++;
    count--;
  }
  return *arr1-*arr2;
}

int main(void)
{
    char *arr1 = "abcd";
    char *arr2 = "abcde";
    int len=strlen(arr1);
    int ret= my_strncmp(arr1, arr2,len);
    printf("%d\n",ret);
    system("pause");
}

这里写图片描述

模拟实现函数,最重要的就是理解这个函数的工作原理,明白要实现的功能。在没有头绪的时候,不妨多举几个例子去模拟一下这个函数,理解后动笔写也会更加容易。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值