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

c语言中字符串函数strlen,strcmp,strcpy,srtcat,strncpy,strncat,strncmp

1.strlen的使用和模拟实现

strlen 用来求字符串的长度,统计'\0'之前字符的个数。

模拟实现1:计数参数法

#include<stdio.h>
#include<assert.h>
size_t my_strlen(char* str)
{int count=0;assert(str);//assert断言是判断是字符串不能为空while(*str!='\0'){count++;//计数 str++; //指向下一个元素 } return count;//返回字符的个数 
}
int main()
{char arr[]="abcdef";//初始化size_t len =my_strlen(arr);//调用函数printf("%d\n",len);//打印出字符的个数return 0; } 

模拟实验2:指针方法

#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{const char*start=str;assert(str);//assert断言是判断是字符串不能为空while(*str!='\0'){str++; //指向下一个元素 } return str-start;
}
int main()
{char arr[]="abcdef";//初始化size_t len =my_strlen(arr);//调用函数printf("%d\n",len);//打印出字符的个数return 0; } 

模拟实验3:递归方法

#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{assert(str);//assert断言是判断是字符串不能为空if(*str!='\0'){return 1+my_strlen(str+1);//递归方法 }else{return 0;//返回字符的个数 } 
}
int main()
{char arr[]="abcdef";//初始化size_t len =my_strlen(arr);//调用函数printf("%d\n",len);//打印出字符的个数return 0; } 

2,strcpy 的使用和模拟实现(拷贝字符串)

char* strcpy(char * destination,const char * source);

1:源字符串必须以’\0‘结束

2:会将源字符串中的’\0‘拷贝到目标空间

3:目标空间必须足够大,以确保能存放源字符串

4:目标空间必须可以修改

strcpy的模拟实现一:

#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcpy(char* dest,const char* str)
{assert(str&&dest);//assert断言是判断是字符串不能为空char*ret=dest;//将目标字符的首地址复制给ret while(*dest++=*src++)//直到src复制完成后到最后的\0 {;}*dest=*src;//再将最后的\0复制过去 return ret;//返回目标空间的起始地址 
}
int main()
{char arr1[]="abcdef";//初始化char arr2[20]={0}; my_strcpy(arr2,arr1);//调用函数将arr1里面的字符拷贝到arr2里面 printf("%s\n",arr2);//打印出arr2字符return 0; } 

strcpy的模拟实现二:

#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcpy(char* dest,const char* src)
{while(*src!='\0)//直到src复制完成后到最后的\0 {assert(dest);//调到的函数不为空*dest=*src;//赋值头指针 dest++; src++; }*dest=*src;//再将最后的\0复制过去 
}
int main()
{char arr1[]="abcdef";//初始化char arr2[20]={0}; my_strcpy(arr2,arr1);//调用函数将arr1里面的字符拷贝到arr2里面 printf("%s\n",arr2);//打印出arr2字符return 0; } 

3.strcat的使用和模拟实现(连接)

源字符串必须以'\0'结束

目标字符串中也得有\0,否则没办法知道追加从哪里开始

目标空间必须有足够大,能容纳下源字符串的内容

目标空间必须可以修改

strcat模拟实现

#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcat(char* dest,const char* src)
{char*ret=dest;//将dest的首地址赋值给ret assert(src);//判断使src字符串不为空 while(*dest!='\0) {dest++; //直到找到dest字符串的末尾 }while(*dest++=*src++)//依次进行赋值 {;} return ret;// 返回ret的值 
}
int main()
{char arr1[]="abcdef";//初始化char arr2[20]={0}; my_strcat(arr2,arr1);//调用函数将arr1里面的字符拷贝到arr2里面 printf("%s\n",arr2);//打印出arr2字符return 0; } 

那么strcat可以自己复制自己吗?

不可以,那样的话就找不到'\0'了,'\0'被覆盖了,就停不下来了。

4.strcmp的使用和模拟实现

*第一个字符串大于第二个字符串,则返回大于0的数字

*第一个字符串等于第二个字符串,则返回0

*第一个字符串小于第二个字符串,则返回小于0的数字

      int strcmp(const  cahr*str1,const char *str2)

      比较的不是字符串的长度,而是对应位置上字符的大小

strcmp函数的模拟实现

#include<stdio.h>
#include<assert.h>
#include<string.h>
int my_strcmp(const char*str1,const char* str2)
{assert(str1&&str2);//assert断言是两个字符出串都不为空 while(*str1==*str2){if(*str1=='\0')//在循环里面比较完后,说明都相等 {return 0;}str1++;//字符相等的时候继续往后进行比较 str2++;}return (*str1-*str2);//返回他们的差值 
} 
int main()
{char arr1[]="abcdef";//初始化char arr2[]="abcfr"; int ret=my_strcmp(arr1,arr2);//调用函数将arr1里面的字符与arr2及进行比较 printf("%d\n",ret);//打印出返回的值 return 0; } 

5.strncpy函数的使用和模拟实现

 char *strncpy(char * dest ,char * src , size_t num)

//多了这么一个参数,就是将src中num个字符拷贝给dest

#include<stdio.h>
#include<string.h> 
int main()
{char arr1[]="abcdef";//初始化char arr2[20]="{0}"; strncpy(arr2,arr1,3); //将arr1中的三个字符 拷贝给arr2 printf("%s",arr2);return 0; } 

strncpy的模拟实验

#include<stdio.h>
void my_strncpy(char* dest,const char* src,size_t num)
{size_t i=0;for(i=0;i<num&&*src!='\0';i++)//判断条件是src不为空的时候对其进行赋值 {*dest=*src;dest++;src++;}for(;i>num;i++)//将dest后的字符置为空 {*dest='\0';}} 
int main()
{char arr1[]="abcdef";//初始化char arr2[20]="{0}"; my_strncpy(arr2,arr1,4); //将arr1中的三个字符 拷贝给arr2 printf("%s",arr2);return 0; } 

6.strncat的使用和模拟实现

   char * strncat(char *dest,const *src,size_t num)

//多了这么一个参数,就是src从末尾开始加num个字符

#include<stdio.h>
#include<string.h> 
int main()
{char arr1[]="abcdef";//初始化char arr2[20]="{0}"; my_strncpy(arr2,arr1,4); //将arr1中的三个字符 拷贝给arr2 printf("%s",arr2);return 0; } 

strncat的模拟实现

#include<stdio.h>
#include<assert.h>
#include<string.h>
void my_strcat(char *dest,const char* src,size_t num)
{assert(dest&&src);size_t i;while(*dest!='\0'){dest++;//是指针指到dest的尾指针 }for(i=0;i<num&&*src!='\0';i++){*dest=*src;//将num个字符依次加到dest里面 dest++;src++;}*dest='\0';//把末尾的\0加上 
}
int main()
{char arr1[]="abcdef";//初始化char arr2[20]="hahhah"; my_strcat(arr2,arr1,4); //将arr1中的4个字符加到arr2后面 printf("%s",arr2);return 0; } 

7.strncmp的使用和模拟实现

char *strncmp(char *dest,const char *src,size_t num)

//多了一个num是最多比较字符的个数

#include<stdio.h>
#include<string.h>
int main()
{char arr1[]="abcdefg";char arr2[]="abcfr";int ret=strncmp(arr1,arr2,4);//将arr1和arr2的前四个字符进行比较 printf("%d",ret);return 0;} 

//说明arr1对应字符的大小比arr2小。

strncmp的模拟实现

#include<stdio.h>
#include<assert.h> 
int my_strncmp(const char* dest,const char*src,size_t num)
{assert(dest&&src);for(size_t i=0;i<num;i++){if(dest[i]!=src[i])//如果字符不相等返回差值 {return (unsigned char)dest[i]-(unsigned char)src[i];}if(dest[i]=='\0')//如果遇到的也会继续比较,直到num个结束后 {return 0;//前几个字符相等返回0 }}return 0;
}
int main()
{char arr1[]="abcdefg";char arr2[]="abcfr";//初始化 int ret=my_strncmp(arr1,arr2,4);//将arr1和arr2的前四个字符进行比较 printf("%d",ret);return 0;} 

相关文章:

c语言中字符串函数strlen,strcmp,strcpy,srtcat,strncpy,strncat,strncmp

1.strlen的使用和模拟实现 strlen 用来求字符串的长度&#xff0c;统计\0之前字符的个数。 模拟实现1&#xff1a;计数参数法 #include<stdio.h> #include<assert.h> size_t my_strlen(char* str) {int count0;assert(str);//assert断言是判断是字符串不能为空w…...

携程线下一面,面试内容:

面试时间&#xff1a;2024/9/12 • 实例方法和静态方法有什么不一样? • Java中的异常有哪几类?分别怎么使用? • 常用的集合类有哪些?比如List如何排序? • ArrayList和LinkedList内部的实现大致是怎样的?他们之间的区别和各自适应的场景是什么? • 内存溢出是怎么…...

DeepL翻译:全世界最准确的翻译

DeepL翻译是一款高质量的机器翻译工具&#xff0c;以下从产品描述、产品特色、适用人群、适用场景四个方面对其进行介绍&#xff1a; 体验地址&#xff1a;DeepL翻译&#xff1a;全世界最准确的翻译 产品描述 DeepL是一家德国公司&#xff0c;以其高质量的机器翻译服务而闻名…...

15分钟学Go 实战项目一:命令行工具

实战项目一&#xff1a;命令行工具 1. 引言 命令行工具是开发者常用的工具之一&#xff0c;它可以帮助用户通过命令行界面对程序进行控制和交互。在这节中&#xff0c;我们将创建一个简单的命令行工具&#xff0c;以帮助你理解Go语言的基本语法和如何处理命令行输入。在这个过…...

lesson02 作业

lesson02-01作业 小红的体重是 m 千克&#xff0c;她想知道自己的体重在磅&#xff08;1 千克约等于 2.20462 磅&#xff09;是多少 输入描述 输入一个整数表示小红的标准体重m(kg) 输出描述 输出一个整数表示转换后的磅值n 磅 示例 输入&#xff1a; 50 输出&#xff1a…...

港大和字节提出长视频生成模型Loong,可生成具有一致外观、大运动动态和自然场景过渡的分钟级长视频。

HKU, ByteDance&#xff5c;⭐️ 港大和字节联合提出长视频生成模型Loong&#xff0c;该模型可以生成外观一致、运动动态大、场景过渡自然的分钟级长视频。选择以统一的顺序对文本标记和视频标记进行建模&#xff0c;并使用渐进式短到长训练方案和损失重新加权来克服长视频训练…...

RabbitMQ进阶_可靠性

文章目录 一、 发送者的可靠性1.1、 生产者重试机制1.2、 生产者确认机制1.2.1、确认机制理论1.2.2、确认机制实现1.2.2.1、定义ReturnCallback1.2.2.2、定义ConfirmCallback 二、 MQ的可靠性2.1、 数据持久化2.1.1、 交换机持久化2.1.2、 队列持久化2.1.3、 消息持久化 2.2、 …...

JavaScript字符串的常用方法有哪些?

1.1操作方法 归纳为增删查改 1.1.1增 这里不是直接增添内容&#xff0c;而是创建字符串的一个副本&#xff0c;再进行操作 处理用以及${}进行字符串拼接外&#xff0c;还可以通过concat 1.1.1.1concat 用于将一个或多个字符串拼接为一个新字符串&#xff08;浅拷贝&#…...

jmeter发送post请求

在jmeter中&#xff0c;有两种常用的请求方式&#xff0c;get和post.它们两者的区别在于get请求的参数一般是放在路径中&#xff0c;可以使用用户自定义变量和函数助手等方式进行参数化&#xff0c;而post请求的参数不能随url发送&#xff0c;而是作为请求体提交给服务器。而在…...

图文深入理解Oracle Total Recall

List item 题记&#xff1a;本文图文深入理解Oracle Total Recall技术。 1. Oracle Total Recall 概述 Oracle Total Recall&#xff08;也称为 Flashback Data Archive - 闪回数据归档&#xff09;提供了一种用于跟踪数据库更改的机制&#xff0c;可自动跟踪数据库历史更改…...

腾讯云控制台URL刷新URL预热 使用接口刷新

如图所示的俩个控制台功能&#xff0c;调用腾讯云的接口执行这俩个动作 &#xff08;代码可以优化&#xff09;nodejs框架是express, 这里粘贴调用成功的代码示例&#xff0c;做个记录。 app.get(/PurgeUrlsCache, async function (req, res, next) {// Depends on tencentclo…...

构建后端为etcd的CoreDNS的容器集群(二)、下载最新的etcd容器镜像

在尝试获取etcd的容器的最新版本镜像时&#xff0c;使用latest作为tag取到的并非最新版本&#xff0c;本文尝试用实际最新版本的版本号进行pull&#xff0c;从而取到想的最新版etcd容器镜像。 一、用latest作为tag尝试下载最新etcd的镜像 1、下载镜像 [rootlocalhost opt]# …...

libaom-all-intra参数说明

part_sf.less_rectangular_check_level 1; 这个设置可能控制编码器在分割画面时使用非矩形分区的检查级别。part_sf.ml_prune_partition 1; 这个设置可能用于基于机器学习&#xff08;ML&#xff09;的分区修剪&#xff0c;以减少不必要的计算。part_sf.prune_ext_partition_…...

应用假死?

有个客户10月18日应用接口都访问慢&#xff0c;nginx层面error显示连接拒绝&#xff0c;当时实施同学重启了java应用运行正常&#xff0c;但今天又卡死了&#xff0c;后台登录也登录不上去&#xff0c;看日志没异常&#xff0c;最终找到了数据库层面。 查看数据库相关日志&…...

SAP MM+FI - 物料管理模块与财务会计模块的集成配置

01 采购费用过账配置表 为了方便项目实施过程中采购费用过账配置&#xff0c;迪森资深专家根据丰富经验总结得出采购费用过账配置表&#xff0c;以供大家参考&#xff1a; 02 材料采购订单入库及结算 2.1采购订单入库 假设&#xff1a;入库数量1000PC&#xff0c;价格 10 元…...

初阶数据结构【3】--单链表(比顺序表还好的一种数据结构!!!)

本章概述 前情回顾单链表实现单链表彩蛋时刻&#xff01;&#xff01;&#xff01; 前情回顾 咱们在上一章博客点击&#xff1a;《顺序表》的末尾&#xff0c;提出了一个问题&#xff0c;讲出了顺序表的缺点——有点浪费空间。所以&#xff0c;为了解决这个问题&#xff0c;我…...

mysql迁移到达梦的修改点

字段是达梦关键字的&#xff0c;达梦会给转成大写&#xff0c;如果不要转则需要使用双引号引起来。关键字参考&#xff1a;D:\dmdbms\doc\DM8_SQL语言使用手册.pdf 例如&#xff1a;RowCount Level Content Password Locked 中文乱码问题&#xff0c;需要在应用程序所在服务器的…...

Go小技巧易错点100例(十八)

正文&#xff1a; 使用下划线增加数字可读性 有时候我们代码里会定义很长的数字&#xff0c;虽然计算机程序能支持很大的数据的计算&#xff0c;但是对我们来说&#xff0c;可读性是一个需要考虑的点&#xff0c;特别是1后面全是0的时候。 但是这个问题在Go语言中是可以通过…...

【python】极简教程8-字符串

第八章:字符串 8.1 字符串即序列 字符串是一系列字符的有序集合,可以使用索引访问字符串中的各个字符,索引从 0 开始。 示例代码: fruit = banana letter = fruit[1] print(letter) # 输出: a8.2 len 函数 len 函数返回字符串的长度(字符数)。...

UEFI EDK2框架学习 (四)——UEFI图形化

一、修改protocol.c #include <Uefi.h> #include <Library/UefiLib.h> #include <Library/UefiBootServicesTableLib.h> #include <stdio.h>EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE *SystemTable ) {EFI_STATUS S…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...