模拟实现C语言库函数strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove

C语言库函数实现练习

1.模拟实现strcpy

strcpy是字符串复制函数,把从src(源字符串指针)地址开始且含有’\0’结束符的字符串复制到以dest(目的字符串指针)开始的地址空间。
注意:在进行复制时是连字符串结束标识符‘\0’一并复制
只能拷贝字符串。

#include<stdio.h>  
#include<assert.h>  
char *my_strcpy(char *dst, const char *src)  
{  
    char *start = dst;           
    assert(dst != NULL);       
    assert(src != NULL);  
    while (*dst++ = *(char*)src++)      
    {  
        ;  
    }  
    return start;      //返回起始地址  
}  
int main()  
{  
    char arr1[20] = "Helloween";  
    char arr2[] = "Hello";  
    char *p = my_strcpy(arr1, arr2);  
    printf("%s\n", p);  

    return 0;  
}  

2.模拟实现strcat

strcat是用于字符串连接的函数,会将参数 src 字符串复制到参数 dest 所指的字符串尾部;dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的字符串的尾部再增加一个 NULL。
注意:dest 与 src 所指的内存空间是不能重叠的,并且dest 要有足够的空间来容纳要复制的字符串。

#include<stdio.h>
#include<assert.h>
char *my_strncat(char *dst, const char *src, size_t n)  
{  
    char *start = dst;  
    assert(dst != NULL);  
    assert(src != NULL);  
    while (*dst)  
    {  
        dst++;  
    }  
    while (n--)  
    {  
        *dst++ = *(char*)src++;  
    }  
    return start;  
}  

int main()  
{  
    char arr1[60] = "Hello, ";  
    char arr2[] = "world";  
    char *p = my_strncat(arr1, arr2, 5);  
    printf("%s\n", p);  

    return 0;  
}  

3.模拟实现strstr

strstr是从字符串str1中查找是否有字符串str2函数。如果str2是str1的子串,确定子串在str1中第一次出现的位置,返回这个位置的地址。
如果不是子串,返回NULL。

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

char * my_strstr(char * dest, char * src)
{
    char *p = dest;
    char *s1 = p;
    char *s2 = src;
    assert(dest);
    assert(src);
    while (*s1)
    {
        s1 = p;
        s2 = src;
        while ((*s1!='\0')&&(*s2 != '\0'))
        {
            if (*s1++ == *s2++)
            {
                ;
            }
            else
            {    
                p++;
                break;
            }
        }
        if (*s2 == '\0')
        {
            return p;
        }    
    }
}

int main()
{
    char *str1 = "hellow,world";
    char *str2 = "world";
    char *ret = my_strstr(str1, str2);
    printf("%s\n", ret);
    system("pause");
    return 0;
}

4.模拟实现strchr

strchr是查找字符串s中首次出现某个字符的位置。返回某字符首次出现的位置,如果字符不存在,返回NULL。

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

char*my_strchr(const char *string,char c)
{
    int i = 0;
    assert(string);
    while (*string!=NULL)
    {
        if (*string == c)
        {
            return string;
        }
        else
        {
            string++;
        }
    }
    return NULL;
}

int main()
{
    char*arr = "hellow";
    char p = 'o';
    char *ret = my_strchr(arr, p);
    printf("%s", ret);
    return 0;
}

5.模拟实现strcmp

strcmp是比较两个字符串,若str1==str2,返回0。若str1

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int my_strcmp(const char *s1, const char *s2)
{
    assert(s1);
    assert(s2);
    while ((*s1 == *s2) && (*s1 != '\0'))
    {
        s1++;
        s2++;
    }
    return *s1 - *s2;
}
int main()
{
    int ret = 0;
    char str1[40] = "helloworld";
    char str2[20] = "world";
    ret = my_strcmp(str1, str2);
    printf("%d\n", ret);
    system("pause");
    return 0;
}

6.模拟实现memcpy

memcpy是内存拷贝函数,是将N个字节的源内存地址的内容拷贝到目标内存地址中。
拷贝时会有一个变量size控制。memcpy和strcpy不同,它可以拷贝任意内容。而且strcpy复制时不指定长度,有可能会溢出。
注意!使用memcpy时要保证源和目标的内存区域不能重叠

#include <stdio.h>  
#include<stdlib.h> 
void * my_memcpy(void * dst, const void * src, int count)  
{  
    void *ret = dst;  
    while (count--)  
    {  
        *(char *)dst = *(char *)src;  
        dst=(char *)dst+1;  
        src=(char *)src+1;  
    }  
    return ret;  
}  
int main()  
{  
    char p[] = "hellow";   
    char *a = "hi";  
    my_memcpy(p, a, 2);  
    printf("%s\n", p);  
    return 0;  
}  

memmove也是内存拷贝函数,和memcpy的作用是一样的,区别是,当内存发生局部重叠的时候memmove
可以保证拷贝结果正确,memcpy不能保证结果正确。

这种情况,不存在内存重叠,memcpy和memmove都可以保证结果正确。
这种情况,不存在内存重叠,memcpy和memmove都可以保证结果正确。

这种情况下,拷贝的内容已经被覆盖,用memmove可以保证结果正确。
这种情况下,拷贝的内容已经被覆盖,用memmove可以保证结果正确。

7.模拟实现memmove

#include <stdio.h>  
#include <assert.h>
void * memmove(void * dst, const void * src, int count)  
{  
    void * ret = dst;  
    assert(dst);  
    assert(src);  
    if (dst <= src || (char *)dst >= ((char *)src + count))     
    {  
        while (count--)   
        {  
            *(char *)dst = *(char *)src;  
            dst = (char *)dst + 1;  
            src = (char *)src + 1;  
        }  
    }  
    else                                                     
    {  
        dst = (char *)dst + count - 1;  
        src = (char *)src + count - 1;  
        while (count--)   
        {  
            *(char *)dst = *(char *)src;  
            dst = (char *)dst - 1;  
            src = (char *)src - 1;  
        }  
    }  
    return ret;  
}  
int main()  
{  
    char p[] = "hello!";  
    char *q = "world";  
    memmove(p, q,strlen(q)+1 );  
    printf("%s\n", p);  
    return 0;  
}  
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值