【C语言】【字符串函数的模拟实现】strcpy,strcat,strcmp,strncpy,strncat,strstr

本文主要是介绍【C语言】【字符串函数的模拟实现】strcpy,strcat,strcmp,strncpy,strncat,strstr,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.strcpy

char* strcpy(char*destination,const char* source)
  • 源字符串必须以’\0’结尾
  • 会将原字符串中的‘\0’拷贝到目标字符串中
  • 目标空间必须足够大,能放得下源字符串

模拟实现:

char *my_strcpy(char* des,const char *sour)
{char* ret=des;assert(des);assert(sour);while(*des++=*sour++){;}return ret;

当sour走到’\0’的时候,跳出循环,完成拷贝

2.strcat

在目标字符串的末尾追加源字符串

  • 目标字符串和源字符串都必须以’\0’结束
  • 目标空间必须足够大

模拟实现

char* my_strcat(char* des,const char* source)
{assert(des);assert(source);char* ret=des;while(*des){des++;}while((*des++=*source++)){;}return ret;

3.strcmp

比较两个字符串的大小,通过两个字符串对应位置上字符ACLL码值的大小比较
如果两者第一个字符的ACLL码值相等,则继续比较第二个,依次往后比较
如果有一个字符串走到’\0’ 那么就用0 和另一个字符串中对应位置元素的ACLL码值比较

int strcmp(const char*str1,const char* str2)
  • 第一个字符串大于第二个 ->返回大于0的值
  • 小于–>返回小于0的值
  • 等于—>返回0

模拟实现

int my_strcmp(const char* str1,const char* str2)
{assert(str1);assert(str2);while(*str1==*str2){if(*str1=='\0')return 0;str1++;str2++;}return *str1-*str2;

4.strncpy

char* strnpy(char* des,const char* source,size_t num);

从字符串source中拷贝num个字符到目标字符串
如果源字符串中的字符数不足num,则在源字符串后面补0直到num个

5.strncat的使用

把指定个数的字符追加到一个字符串后面

#include<stdio.h>
#include<string.h>
int main()
{char des[20];char source[20];strcpy(des, "To be ");strcpy(source, "or not to be");strncat(des, source, 6);printf("%s", des);
}

在这里插入图片描述

在这里插入图片描述

6.strstr

作用是从一个字符串中查找指定字符串,返回所要查找的字符串首字符的地址

char* strstr(const char*,const char*);

使用举例:

#include <stdio.h>
#include <string.h>
int main()
{char str[] = "This is a simple string";char* pch;pch = strstr(str, "simple");strncpy(pch, "sample",6);printf("%s\n", str);return 0;
}

在这里插入图片描述

注意: 这里用strncpy,而不用strcpy,是因为strncpy可以复制指定个数的字符,可以用个数控制’\0’的复制,如果不想复制’\0’,上述个数就为6,若要复制’\0’,上述个数就为7。但是strcpy就一定会在末尾加上’\0’
在这里插入图片描述

模拟实现:

char* my_strstr(const char* str1, const char* str2)
{char* cp = (char*)str1;char* s1;char* s2 = (char*)str2;if (!*str2){return cp;}while (*cp){s1 = cp;s2 = (char*)str2;while (*s1 && *s2 && !(*s1 - *s2)){s1++;s2++;}if (!*s2)return cp;cp++;}return NULL;
}

这篇关于【C语言】【字符串函数的模拟实现】strcpy,strcat,strcmp,strncpy,strncat,strstr的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/445270

相关文章

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被