千家信息网

怎么用C语言实现常用字符串库函数

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容介绍了"怎么用C语言实现常用字符串库函数"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、实
千家信息网最后更新 2026年11月03日怎么用C语言实现常用字符串库函数

本篇内容介绍了"怎么用C语言实现常用字符串库函数"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    一、实现memcpy

    将src所指向的内容拷贝到dst所指向的位置,拷贝len个字节。

    • memcpy是内存拷贝函数

    • memcpy在使用的时候不用考虑类型,以字节为单位进行拷贝

    • 遇到"\0"的时候不会停下,所以拷贝字符串的时候最好还是用strcpy,它更安全。

    void *Mymemcpy(void * dst, const void * src, int len){        void *ret = dst;        assert(src);        assert(dst);        while (len--){                *(char *)dst = *(char *)src;                dst = (char *)dst + 1;                src = (char *)src + 1;        }        return ret;}int main(){        char str[100] = "ABCDE";        Mymemcpy(str, str + 2, 2);        printf("%s", str);        system("pause");        return 0;}

    但是当我们修改了测试用例后发现了如下结果

    出现这种情况的原因很简单,因为我们源字符串的首地址低于目标字符串的首地址,当我们默认从左向右拷贝的时候第一个字符串会覆盖第二个字符串,所以出现了全A的情况,这就是内存重叠拷贝,要解决这个问题非常简单,只需要在拷贝之前加一个判断,如果源字符串的首地址低于目标字符串的首地址则我们从右向左拷贝,这样就可以完美解决这个问题。

    二、memmove模拟实现

    这里我们重复刚才的测试用例,发现加入了判断并从右向左拷贝了之后没有出现全A的情况。

    void * Mymemmove(void * dst, const void *src, int len){        char *_src = (char*)src;        char *_dst = (char*)dst;        if (_dst > _src&&_dst < _src + len){                _dst = _dst + len - 1;                _src = _src + len - 1;                while (len--){                        *_dst = *_src;                        _dst--;                        _src--;                }        }        else {                while (len--){                        *_dst = *_src;                        _dst++;                        _src++;                }        }        return dst;}int main(){        char str[100] = "ABCDE";        int len = strlen(str);        memcpy(str+1, str , len);        printf("%s", str);        system("pause");        return 0;}

    三、strlen的模拟实现

    1.计数器方法:

    int Mystrlen(char * str){        int count = 0;        while (*str != 0){                str++;                count++;        }        return count;}int main(){        char a[] = "dadai";        int aa=Mystrlen(a);        printf("%d", aa);        system("pause");        return 0;}

    2.递归方式:

    int Mystrlen(char * str){        if (*str == '\0'){                return 0;        }        else return (1 + Mystrlen(str + 1));}//1+1+1+1+1+0int main(){        char a[] = "dadai";        int aa=Mystrlen(a);        printf("%d", aa);        system("pause");        return 0;}

    3.利用指针实现:

    int Mystrlen(char * str){        char *p = str;        while (*p){                p++;        }        return (p - str);}int main(){        char a[] = "dadai";        int aa=Mystrlen(a);        printf("%d", aa);        system("pause");        return 0;}

    四、strcpy的模拟实现

    将src所指向的内容拷贝到dst所指向的存储单元。

    char * Mycpy(char *dst, const char * src){assert(dst != NULL && src !=NULL);char *Mycpy = dst;while((*dst++ = *src++) != '\0');return Mycpy;}int main(){        char src []= "daadok";        char dst[10] ;        Mycpy(dst, src);        printf("%s", dst);        system("pause");        return 0;}

    五、strcmp的模拟实现

    strcmp用于比较两个字符串是否相等,若相等则返回0,若dst>src则返回1,否则换回-1.

    int Mystrcmp(const char* dst,const char * src){        while (*dst&&*src&&(*dst == *src)){                dst++;                src++;        }        if (*dst > *src){                return 1;        }        else if (*dst < *src){                return -1;        }        else if (*dst == *src){                return 0;        }}int main(){        char str1[] = "abcdefg";        char str2[] = "dfd";        int a=Mystrcmp(str1, str2);;        printf("%d", a);        system("pause");        return 0;}

    六、strstr模拟实现

    在dst中找到第一次与src相等的位置并输出这个位置之后dst所指向的内容。

    char *mystrstr( const char *dst,const  char *src){        assert(dst);        assert(src);        const char *p = dst;        while (*p){                const char *movep = p;                const char *sp = src;                while(*movep && *sp&& *sp== *movep){                        sp++;                        movep++;                }                if (*sp == '\0'){                        return (char *)p;                }                p++;        }        return NULL;}int main(){        const char* dst = "abcd123456";        const char*src = "cd";        char *ret= mystrstr(dst, src);        printf("%s", ret);        system("pause");        return 0;}

    七、模拟实现strcat

    把src所指向的内容拼接到dst所指向内容的末尾。

    char * mystrcat(char*dst, const char*src){        assert(src);        assert(dst);        char*ret = dst;        while (*dst){                dst++;        }        while (*src){                *dst = *src;                dst++; src++;        }        return ret;}int main(){        char dst[64] = "abcd";        char *src = "efg";        mystrcat(dst, src);        printf("%s", dst);        system("pause");        return 0;}

    "怎么用C语言实现常用字符串库函数"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

    拷贝 字符 字符串 内容 指向 地址 情况 时候 函数 位置 常用 语言 内存 字节 更多 目标 知识 问题 测试 输出 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 湖南永感互联网科技有限公司 互联网科技公司华为 互联网电商科技 猪兼强互联网科技 哈尔滨新华互联网科技 宁波青枫互联网科技有限公司 新兴科技互联网创新大赛颁奖典礼 健康食品互联网创新科技园项目 明优互联网科技有限公司 保险科技服务互联网营销体系 长沙互联网科技 工业互联网山东科技大学 国大互联网教育科技有限公司薪资 高科技互联网套路 互联网企业科技类企业如何做账 山东大美朱楼互联网科技有限公司 易企秀互联网科技是做什么的 黑龙江互联网科技公司 六子台科技互联网展会 株洲百竞科技的互联网营销顾问 江苏根荣互联网科技 互联网和科技技术 科技企业和互联网企业 北京互联网科技有限公司 互联网 卓越科技 互联网科技中介 互联网科技和信息 国大互联网教育科技有限公司薪资 上海互联网科技公司ppt 马化腾互联网科技教学
    0