当前位置: 首页 > 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…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...