【字符串函数】

1.strlen的使⽤和模拟实现

size_t strlen ( const char * str );

1.字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包
含 '\0' )。
2.参数指向的字符串必须要以 '\0' 结束。
3.注意函数的返回值为size_t,是⽆符号的( 易错 )
4.strlen的使⽤需要包含头文件

测试

int main()
{
	char arr[] = "abcd";
	int len = strlen(arr);
	printf("%d", len);
	return 0;
}

结果

模拟实现

方法1:计数器实现

int mystrlen(const char* arr)
{
  assert(arr);    //省去时间,直接判断字符串是否为NULL  为空直接报错
	int count = 0;
	assert(arr);
	while (*arr)    //首先 \0 在ASCII码中为0 所以这里遇到 \0会停止
	{				//在字符串中最后一位默认为 \0
		count++;
		arr++;
	}
	return count;
}
int main()
{
	char arr[] = "abcd";
	int len= mystrlen(arr);
	printf("%d", len);
}

方法2:不创建临时变量

int mystrlen(const char* arr)
{
	assert(arr);
	if (*arr == '\0')
		return 0;
	else
		return 1 + mystrlen(arr + 1);
}
int main()
{
	char arr[] = "abcd";
	int len= mystrlen(arr);
	printf("%d", len);
}

方法3:指针-指针的方式

int mystrlen(char* s)
{
	assert(s);
	char* p = s;
	while (*p != '\0')
		p++;
	return p - s;
}
int main()
{
	char arr[] = "abcd";
	int len= mystrlen(arr);
	printf("%d", len);
}

2.strcpy的使⽤和模拟实现

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

1.源字符串必须以 '\0' 结束。
2.会将源字符串中的 '\0' 拷⻉到目标空间。
3.目标空间必须⾜够⼤,以确保能存放源字符串。
4.目标空间必须可修改。

测试

int main()
{
	char dest[] = "abcd";
	char src[10] = { 0 };
	strcpy(src, dest);   //前拷贝后
	printf("%s", src);  //%s 字符串   %c 一个字符
	return 0;
}

模拟实现:

char* mystrcpy(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}
int main()
{
	char dest[] = "abcd";
	char src[10] = { 0 };
	mystrcpy(src, dest);   //前拷贝后
	printf("%s", src);  //%s 字符串   %c 一个字符
	return 0;
}

3.strcat的使⽤和模拟实现

  拼字符串

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

1.源字符串必须以 '\0' 结束。
2.目标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
3.目标空间必须有⾜够的⼤,能容纳下源字符串的内容。
4.目标空间必须可修改。

测试

int main()
{
	char dest[10] = "abcd";
	char src[10] ="qwer";
	strcat(dest, src);
	printf("%s", dest);
	return 0;
}

结果:

模拟实现:

char* mystrcat(char* dest, const char* src)
{
	char* ret = dest;  
	//判断两者是否都不为空   
	//另一种方法  assert(dest&&src)
	assert(dest != NULL);
	assert(src != NULL);
	//这里是找到  \0  的位置
	while (*dest)
	{
		dest++;
	}
	//进行数据拷贝
	//将循环 `src` 字符串的每个字符复制到 `dest` 的末尾
	//这里先拷贝  再 ++
	while ((*dest++ = *src++))
	{
		;
	}
	//返回dest里面的内容
	return ret;
}
int main()
{
	char dest[10] = "abcd";
	char src[10] ="qwer";
	mystrcat(dest, src);
	printf("%s", dest);
	//不能自己添加自己
	// mystrcat(dest, dest);
	//1.会死循环
	//2.程序崩溃
	return 0;
}

4.strcmp的使⽤和模拟实现

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

比较两个字符串的大小

标准规定:
第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
第⼀个字符串等于第⼆个字符串,则返回0
第⼀个字符串⼩于第⼆个字符串,则返回小于0的数字

int main()
{
	char arr1[] = "abcd";
	char arr2[] = "abcc";
	int num=strcmp(arr1, arr2);
	printf("%d",num);
	return 0;
}

结果:

模拟实现:

//这里防止改变内容   所以const
int mystrcmp(const char* str1, const char* str2)
{
	int ret = 0;
	assert(str1 != NULL);
	assert(str2 != NULL);
	while (*str1 == *str2)   //比较的是ASCII码值
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;//返回的相差
}
int main()
{
	char arr1[] = "abcd";
	char arr2[] = "abcc";
	int num=mystrcmp(arr1, arr2);
	printf("%d",num);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/711549.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Denoising Prior Driven Deep Neural Network for Image Restoration

之所以能够检索到这篇论文是想看看该论文是如何利用多尺度相似性解决图像去噪问题,除了摘要和结论,论文中两次提到这个术语。next section是指section 4。然后整个section 4,根本没有提多尺度的事儿,更别说解决了。又看了一下The …

excel中按多列进行匹配并对数量进行累加

公司的生产计划是按订单下发,但不同订单的不同产品中可能有用到相同的配件,按单1对1时,对计算机十分友好,但对于在配件库检料的工人来说就比较麻烦,上百条产品里可能会有多条都是相同的产品,首先考虑的办法…

[面试题]Java【并发】

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL 因为 Java 并发涉及到的内容会非常多,本面试题可能很难覆盖到所有的知识点,所以推荐 《Java并发编程的艺术》 。 Java 线程 线程 通知 等待 线…

Linux C编译器从零开发一

基础程序汇编 test.c int main() {return 42; } 查看反汇编 cc -o test test.c objdump -d -M intel test 0000000000001129 <main>:1129: f3 0f 1e fa endbr64 112d: 55 push rbp112e: 48 89 e5 mov rbp,rsp1131: b…

抽象工厂模式(大话设计模式)C/C++版本

抽象工厂模式 C 参考&#xff1a;https://www.cnblogs.com/Galesaur-wcy/p/15927110.html #include <iostream> using namespace std;// 抽象产品Department ,定义具体产品的公共接口 class Department { public:virtual ~Department() default;virtual void Insert()…

Rust 实战丨并发构建倒排索引

引言 继上篇 Rust 实战丨倒排索引&#xff0c;本篇我们将参考《Rust 程序设计&#xff08;第二版&#xff09;》中并发编程篇章来实现高并发构建倒排索引。 本篇主要分为以下几个部分&#xff1a; 功能展示&#xff1a;展示我们最终实现的 2 个工具的效果&#xff08;构建索…

大话C语言:第24篇 预处理

1 C语言编译流程 C语言的编译流程包括&#xff1a; 预编译&#xff1a;将.c 中的头文件展开、宏展开&#xff0c;生成的文件是.i 文件。gcc指令&#xff1a;gcc -E file.c -o file.i 编译&#xff1a;将预处理之后的.i 文件生成 .s 汇编文件。gcc指令&#xff1a;gcc -S file…

逢3必过报数游戏-第13届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第84讲。 逢3必过报数游戏&…

直流放大器

一&#xff0c;概念及存在问题 集成电路主要由半导体材料构成&#xff0c;其内部适合用二极管&#xff0c;三极管等类型的元器件制作&#xff0c;而不适用电容&#xff0c;电感和变压器&#xff0c;因此集成放大电路内部多个放大电路之间通常采用直接耦合。直接耦合电路除了可…

文生视频新王登场:Luma官宣免费、电影级大片生成,Sora?可灵?SD3.0?(内附网址)

✨点击这里✨&#xff1a;&#x1f680;原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; 文生视频新王登场&#xff1a;Luma官宣免费、电影级大片生成&#xff0c;Sora&#xff1f;可灵&am…

TJA1145休眠唤醒调试

目录 项目场景:TJA1145引脚图问题描述SPI链路验证休眠唤醒休眠唤醒配置唤醒报文配置代码相关寄存器:模式寄存器使能CAN唤醒设置唤醒边沿检测事件状态及捕获寄存器CANFD报文不会被识别为有效的唤醒帧项目场景: 最近开发过程中,选择了这颗芯片,踩了很多坑,总算是把这个芯片…

基于RandLA-Net深度学习模型的激光点云语义分割

一、场景要素语义分割部分的文献阅读笔记 RandLA-Net是一种高效、轻量级的神经网络&#xff0c;其可直接逐点推理大规模点云的语义标签。RandLA-Net基于随机点采样获得了显著的计算和内存效率&#xff0c;并采用新的局部特征聚合模块有效地保留了几何细节&#xff0c;弥补了随机…

【报错】无法找到模块“element-plus/es/locale/index.mjs”的声明文件。

报错&#xff1a; 无法找到模块“element-plus/es/locale/index.mjs”的声明文件。“E:/codeAll/work/test1/test2/HealinLikeMe-ui/node_modules/.pnpm/element-plus2.7.3_vue3.4.27_typescript5.4.5_/node_modules/element-plus/es/locale/index.mjs”隐式拥有 "any&quo…

51 USART数据收发

1.0 USART实现单个数据收发 串口启动之前需要对串口进行初始化&#xff0c;主要是设置产生波特率的定时器1&#xff0c;使用串口的工作方式还是中断的工作方式具体的配置步骤如下所示。 注&#xff1a; 1&#xff1a; 确定TMOD &#xff08;定时器模式寄存器&#xff09; 确…

vue3医疗项目

配置src别名 打开viteconfig.js文件进行配置 import { defineConfig } from "vite"; import vue from "vitejs/plugin-vue"; // 引入node提供内置模块path&#xff1a;可以获取绝对路径 import path from "path";// https://vitejs.dev/config…

Lexar NM620 512GB SSD PCIE3.0 X4测评

Lexar NM620 512GB SSD PCIE3.0 X4测评 官方可选容量256GB~2TB PCIE 3.0X4 支持NVME 1.4协议 CDM顺序Read速度3448MB\s CDM顺序Write速度2626MB\s CDM 4K随机Read速度465MB\s CDM 4K随机Write速度602MB\s AS SSD顺序Read速度为2855MB\s AS SSD顺序Write速度为2331MB\s AS SSD…

增值税发票OCR识别API在Java、Python、PHP中的使用教程

​增值税发票OCR识别是一种利用光学字符识别&#xff08;OCR&#xff09;技术&#xff0c;自动提取和识别增值税发票上的文字信息的过程。增值税发票是企业在销售商品或提供服务过程中产生的一种税务凭证&#xff0c;包含了关键的财务信息&#xff0c;如商品明细、金额、税率等…

紫光展锐5G处理器T750__国产手机芯片5G方案

展锐T750核心板采用6nm EUV制程工艺&#xff0c;CPU架构采用了八核设计&#xff0c;其中包括两个主频为2.0GHz的Arm Cortex-A76性能核心和六个主频为1.8GHz的A55小核。这种组合使得T750具备卓越的处理能力&#xff0c;并能在节能的同时提供出色的性能表现。该核心模块还搭载了M…

推荐一款可以下载B站视频和音频的工具

cobalt是一个免费的下载网站&#xff0c;主要是用于载视频和音频。只要你把相应的网址复制下来&#xff0c;然后打开cobalt网站&#xff0c;黏贴网址&#xff0c;选择要下载的格式&#xff0c;就可以下载相应的音频或者视频了。 该网站非常简洁&#xff0c;使用也很简单。目前只…

Android入门第69天-AndroidStudio中的Gradle使用国内镜像最强教程

背景 AndroidStudio默认连接的是dl.google的gadle仓库。 每次重新build时: 下载速度慢;等待了半天总时build faild;build到一半connection timeout;即使使用了魔法也难以一次build好;这严重影响了我们的学习、开发效率。 当前网络上的使用国内镜像的教程不全 网上的教程…