c语言模拟实现strncpy、strncat、strncmp函数

题目

c语言模拟实现strncpy、strncat、strncmp函数

分析

strncpy、strncat、strncmp函数与strcpy、strcat、strcmp函数非常相近,但是在str…函数里,它是用依据 \0 作为结束判断的,在一些情况下这是不安全,比如在strcat函数,我们给arr追加arr时,程序就会崩溃,所以用自身的长度来作为循环停止条件是不安全的。
于是就出现了一群“strn…”函数,他们在函数拷贝的过程中,将‘\0‘也拷贝出来,并且以’\0‘作为循环的终止条件,这样子就会避免程序找不到结束条件,自己崩溃的现象。
1.一个最常见的问题,就是strn…并不能帮你保证\0结束。
2.如果源的内容比较小,而 n 又比较大的话,strn将会把之间的空间都用 \0 填充。这又出现了一个效率上的问题。

strncpy
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
char * my_strncpy(char* dest,const char* src,size_t num)
{
    char * ret = dest;
    assert(dest);
    assert(src);
    while(num--)
    {
        *dest++=*src++;
    }
    return ret;
}
int main()
{
    char str1[20]={'0'};
    char str2[10]="abcdefg";
    int num = strlen(str2);
    char *ret = my_strncpy(str1,str2,num);
    printf("str1=%s",ret);
    system("pause");
    return 0;
}

运行结果
这里写图片描述
strncat

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
char * my_strncat(char* dest,const char* src,size_t num)
{
    char * ret = dest;
    assert(dest);
    assert(src);
    while(*dest)
    {
        dest++;
    }
    while(num--)
    {
        *dest++=*src++;
    }
    return ret;
}
int main()
{
    char str1[20]="hello ";
    char str2[10]="world";
    int num = strlen(str2);
    char *ret = my_strncat(str1,str2,num);
    printf("str1=%s",ret);
    system("pause");
    return 0;
}

运行结果
这里写图片描述
strncmp

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
int  my_strncmp(const char* dest,const char* src,size_t count)
{
    assert(dest);
    assert(src);
    while(*dest==*src)
    {
       dest++;
       src++;
       count--;
    }
    return (*dest-*src);
}
int main()
{
    char *str1="aaaaaaa ";
    char *str2="aaabbbb";
    int len=strlen(str2);
    char ret = my_strncmp(str1,str2,len);
    printf("%d\n",ret);
    system("pause");
    return 0;
}

运行结果
这里写图片描述

猜你喜欢

转载自blog.csdn.net/sister_wang0712/article/details/80381095
今日推荐