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 用来求字符串的长度,统计\0之前字符的个数。 模拟实现1:计数参数法 #include<stdio.h> #include<assert.h> size_t my_strlen(char* str) {int count0;assert(str);//assert断言是判断是字符串不能为空w…...
携程线下一面,面试内容:
面试时间:2024/9/12 • 实例方法和静态方法有什么不一样? • Java中的异常有哪几类?分别怎么使用? • 常用的集合类有哪些?比如List如何排序? • ArrayList和LinkedList内部的实现大致是怎样的?他们之间的区别和各自适应的场景是什么? • 内存溢出是怎么…...
DeepL翻译:全世界最准确的翻译
DeepL翻译是一款高质量的机器翻译工具,以下从产品描述、产品特色、适用人群、适用场景四个方面对其进行介绍: 体验地址:DeepL翻译:全世界最准确的翻译 产品描述 DeepL是一家德国公司,以其高质量的机器翻译服务而闻名…...
15分钟学Go 实战项目一:命令行工具
实战项目一:命令行工具 1. 引言 命令行工具是开发者常用的工具之一,它可以帮助用户通过命令行界面对程序进行控制和交互。在这节中,我们将创建一个简单的命令行工具,以帮助你理解Go语言的基本语法和如何处理命令行输入。在这个过…...
lesson02 作业
lesson02-01作业 小红的体重是 m 千克,她想知道自己的体重在磅(1 千克约等于 2.20462 磅)是多少 输入描述 输入一个整数表示小红的标准体重m(kg) 输出描述 输出一个整数表示转换后的磅值n 磅 示例 输入: 50 输出:…...
港大和字节提出长视频生成模型Loong,可生成具有一致外观、大运动动态和自然场景过渡的分钟级长视频。
HKU, ByteDance|⭐️ 港大和字节联合提出长视频生成模型Loong,该模型可以生成外观一致、运动动态大、场景过渡自然的分钟级长视频。选择以统一的顺序对文本标记和视频标记进行建模,并使用渐进式短到长训练方案和损失重新加权来克服长视频训练…...
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增 这里不是直接增添内容,而是创建字符串的一个副本,再进行操作 处理用以及${}进行字符串拼接外,还可以通过concat 1.1.1.1concat 用于将一个或多个字符串拼接为一个新字符串(浅拷贝&#…...
jmeter发送post请求
在jmeter中,有两种常用的请求方式,get和post.它们两者的区别在于get请求的参数一般是放在路径中,可以使用用户自定义变量和函数助手等方式进行参数化,而post请求的参数不能随url发送,而是作为请求体提交给服务器。而在…...
图文深入理解Oracle Total Recall
List item 题记:本文图文深入理解Oracle Total Recall技术。 1. Oracle Total Recall 概述 Oracle Total Recall(也称为 Flashback Data Archive - 闪回数据归档)提供了一种用于跟踪数据库更改的机制,可自动跟踪数据库历史更改…...
腾讯云控制台URL刷新URL预热 使用接口刷新
如图所示的俩个控制台功能,调用腾讯云的接口执行这俩个动作 (代码可以优化)nodejs框架是express, 这里粘贴调用成功的代码示例,做个记录。 app.get(/PurgeUrlsCache, async function (req, res, next) {// Depends on tencentclo…...
构建后端为etcd的CoreDNS的容器集群(二)、下载最新的etcd容器镜像
在尝试获取etcd的容器的最新版本镜像时,使用latest作为tag取到的并非最新版本,本文尝试用实际最新版本的版本号进行pull,从而取到想的最新版etcd容器镜像。 一、用latest作为tag尝试下载最新etcd的镜像 1、下载镜像 [rootlocalhost opt]# …...
libaom-all-intra参数说明
part_sf.less_rectangular_check_level 1; 这个设置可能控制编码器在分割画面时使用非矩形分区的检查级别。part_sf.ml_prune_partition 1; 这个设置可能用于基于机器学习(ML)的分区修剪,以减少不必要的计算。part_sf.prune_ext_partition_…...
应用假死?
有个客户10月18日应用接口都访问慢,nginx层面error显示连接拒绝,当时实施同学重启了java应用运行正常,但今天又卡死了,后台登录也登录不上去,看日志没异常,最终找到了数据库层面。 查看数据库相关日志&…...
SAP MM+FI - 物料管理模块与财务会计模块的集成配置
01 采购费用过账配置表 为了方便项目实施过程中采购费用过账配置,迪森资深专家根据丰富经验总结得出采购费用过账配置表,以供大家参考: 02 材料采购订单入库及结算 2.1采购订单入库 假设:入库数量1000PC,价格 10 元…...
初阶数据结构【3】--单链表(比顺序表还好的一种数据结构!!!)
本章概述 前情回顾单链表实现单链表彩蛋时刻!!! 前情回顾 咱们在上一章博客点击:《顺序表》的末尾,提出了一个问题,讲出了顺序表的缺点——有点浪费空间。所以,为了解决这个问题,我…...
mysql迁移到达梦的修改点
字段是达梦关键字的,达梦会给转成大写,如果不要转则需要使用双引号引起来。关键字参考:D:\dmdbms\doc\DM8_SQL语言使用手册.pdf 例如:RowCount Level Content Password Locked 中文乱码问题,需要在应用程序所在服务器的…...
Go小技巧易错点100例(十八)
正文: 使用下划线增加数字可读性 有时候我们代码里会定义很长的数字,虽然计算机程序能支持很大的数据的计算,但是对我们来说,可读性是一个需要考虑的点,特别是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…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
