当前位置: 首页 > news >正文

模拟实现strcmp,strcpy,strlen,strcat,strstr

目录

前言

一、模拟实现strlen

二、模拟实现strcmp

三、模拟实现strcpy

四、模拟实现strcat

五、模拟实现strstr

总结


前言

这篇文章主要讲解了库函数的模拟实现,包含strcmp,strcpy,strlen,strcat,strstr


一、模拟实现strlen

    strlen函数用于计算字符串的长度,不包括字符串结束符'\0'。

计算器法:

#include<stdio.h>
#include<string.h>
int my_strlen(char* a) {if (*a == '\0')return 0;int cnt = 0;while (*a++)cnt++;return cnt;
}
int main() {char a1[] = "fjfsdjfsdjsg";int len1 = my_strlen(a1);int len2 = strlen(a1);printf("%d\n", len1);printf("%d\n", len2);return 0;
}

二、模拟实现strcmp

       在C语言中,strcmp函数用于比较两个字符串的大小。其基本原理是逐个比较两个字符串的字符,直到找到不相等的字符或遇到字符串结束符\0。如果两个字符串相等,则返回0;如果第一个字符串大于第二个字符串,则返回正值;反之则返回负值。

#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strcmp(const char* a,const char* b)
{assert(a != NULL);	assert(b != NULL);while ((*a == *b) && (*a != '\n')) {a++; b++;}return *a - *b;
}
int main() {char a1[] = "hellsdjfsdhjjsg";char a2[] = "hello,world";int ret = my_strcmp(a1, a2);if (ret == 0) {printf("两个字符串相等\n");}else if (ret > 0) {printf("第一个字符串大于第二个字符串\n");}else {printf("第一个字符串小于第二个字符串\n");}return 0;
}

        在上述代码中,my_strcmp函数首先使用assert确保输入的字符串不为空。然后,通过一个while循环逐个比较两个字符串的字符。如果字符相等且未到达字符串结束符\0,则继续比较下一个字符。循环结束后,返回两个字符串当前字符的差值。

       在main函数中,我们定义了两个字符串str1str2,并调用my_strcmp函数进行比较。根据返回值,判断并输出两个字符串的大小关系。

重要考虑事项

在实现strcmp函数时,需要注意以下几点:

  • 空指针检查:确保输入的字符串不为空,否则可能会导致程序崩溃。

  • 字符比较:逐个比较字符串的字符,直到找到不相等的字符或遇到字符串结束符\0

  • 返回值:根据两个字符串当前字符的差值返回结果。如果相等返回0,如果第一个字符串大于第二个字符串返回正值,反之返回负值。

三、模拟实现strcpy

       在C语言中,strcpy函数用于将源字符串复制到目标字符串中。我们可以通过逐步优化的代码示例,手动实现这个功能。

       首先,我们可以实现一个基础版本的strcpy函数。这个函数需要两个参数:目标字符串和源字符串。我们使用assert来确保传入的指针不为空,然后使用while循环将源字符串的内容逐个字符地复制到目标字符串中,直到遇到字符串结束符\0

#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strlen(char* a) {if (*a == '\0')return 0;int cnt = 0;while (*a++)cnt++;return cnt;
}
void my_strcpy(char* a, char* b) {assert(a != NULL);assert(b != NULL);while (*b) {*a = *b;a++; b++;}*a = *b;
}
int main() {char a1[] = "fjfsdjfsdjsg";//int len1 = my_strlen(a1);//int len2 = strlen(a1);//printf("%d\n", len1);//printf("%d\n", len2);char a2[] = "hello,world";my_strcpy(a1, a2);printf("%s\n",a1);printf("%s\n", a2);return 0;
}

四、模拟实现strcat

       在C语言中,strcat函数用于将源字符串追加到目标字符串的末尾。其工作原理是找到目标字符串的结尾(即\0),然后从此处开始将源字符串逐个字符复制到目标字符串中,直到遇到源字符串的结束标志\0

#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<windows.h>
char* my_strcat( char* a,const char* b)
{assert(a != NULL);	assert(b != NULL);char* ret = a;while (*a)a++;while (*a++ = *b++);return ret;
}
int main() {char a1[] = "hellsdjfsdhjjsg";char a2[] = "hello,world";char* ret = my_strcat(a1, a2);char* ret2 = strcat(a1, a2);printf("%s\n", ret);printf("%s\n", ret2);system("pause");return 0;
}

  1. 初始化和断言:首先,定义一个临时变量ret来保存目标字符串的起始地址,并使用assert函数确保传入的指针不为空1。

  2. 找到目标字符串的结尾:通过一个while循环,将dest指针移动到目标字符串的结尾(即\0的位置)。

  3. 复制源字符串:通过另一个while循环,将源字符串的每个字符逐个复制到目标字符串中,直到遇到源字符串的结束标志\0

  4. 返回结果:最后,返回目标字符串的起始地址。

注意事项

  • 目标空间大小:确保目标字符串的空间足够大,以容纳源字符串的内容。

  • 字符串结束标志:源字符串和目标字符串都必须以\0结束

五、模拟实现strstr

       在 C 语言中,strstr 函数用于查找一个字符串(b)在另一个字符串(a)中首次出现的位置。如果找到了,它会返回 a中 b 首次出现的位置的指针;如果没有找到,它会返回一个空指针。

#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<windows.h>
char* my_strstr(char* a, const char* b)
{assert(a != NULL);	assert(b != NULL);const char* s1 = a;const char* s2 = b;const char* p = a;while (*p != '\0') {s1 = p;s2 = b;while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2) {s1++;s2++;}if (*s2 == '\0') {return (char*)p;}p++;}return NULL;
}
int main() {char a1[] = "hellsdjfsdhjjsg";char a2[] = "hello,world";char* ret = my_strstr(a1, a2);if(ret!=NULL)printf("%s\n", ret);else printf("没有找到\n");//system("pause");return 0;
}

       在这个自定义的 My_strstr 函数中,我们首先使用 assert 确保传入的两个字符串指针都不是空指针。然后,我们使用两个指针 s1 和 s2 来遍历a 和 b。如果在 a 中找到了b 的完整匹配,我们就返回 a中匹配的起始位置的指针。如果没有找到匹配,我们就返回一个空指针。

         这种实现方法的关键在于,我们需要在a 中逐个字符地查找 b 的首次出现。我们使用一个循环来逐个检查 a 的每个字符,如果当前字符开始的子字符串不匹配 b,我们就移动到 str1 的下一个字符并重复这个过程。如果我们找到了一个匹配,我们就返回当前的位置。如果我们遍历了整个 a 也没有找到匹配,我们就返回 NULL


总结

关于本篇的内容就结束了,对你有帮助的可以点个赞支持一下

http://www.xdnf.cn/news/53839.html

相关文章:

  • 类转换与强制类型转换详解
  • 双目视觉中的动态畸变矫正与跨视角信息融合
  • SmolVLM2: The Smollest Video Model Ever(五)
  • C与C++的区别
  • 656SJBH重金属音乐点歌系统
  • windows拷贝文件脚本
  • Java编程基础(第二篇:类的基本创建)
  • 基于尚硅谷FreeRTOS视频笔记——16—FreeRTOS的任务创建和删除
  • 电源芯片的关键性能指标与分析
  • netty中对TLS支持详解
  • 状态管理最佳实践:GetX框架深度应用
  • Tradingview日内交易策略分享-89%日内交易胜率
  • 【网工第6版】第4章 无线通信网
  • awk命令——功能强大的文本处理工具
  • adb启动没有成功响应解决方法
  • 【去哪儿网】登录滑块逆向算法AES加密分析(逆天滑块轨迹)
  • 柱状图QCPBars
  • Linux系统之部署Dillinger个人文本编辑器
  • vulnhub five86系列靶机合集
  • Windows 10 登录界面隐藏账号
  • DSP28335入门学习——第一节:工程项目创建
  • 使用BQ76PL455和STM32的SAE电动方程式电动汽车智能BMS
  • 聊聊Spring AI Alibaba的FeiShuDocumentReader
  • qwen 32B 模型配置文件参数解释;48 个堆叠的解码器层是什么意思; `max_window_layers`的作用; 定义 `device_map`
  • 节点流和处理流基本使用
  • Python 一等函数( 高阶函数)
  • 【题解-OpenJudge】和为给定数
  • 【人工智能】Agent未来市场与技术潜力分析
  • Linux守护进程
  • 生成对抗网络(Generative adversarial network——GAN)