C语言基础:字符串函数使用和剖析(2)

strcmp(字符串比较,比较两个字符串是否相等)

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

int main()
{
	const char* p1 = "abcdef";
	const char* p2 = "sqwer";
	if ("abcdef" == "sqwer")//千万不能这么比较,因为拿的是首元素地址在比较
	{

	}
	return 0;
}

 标准规定:

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

字符串是怎么比较的:是比字符串的多少吗?当然不是,比的是字符的ASCII码,

从第一个字符开始比,第一个字符分出大小的话就不用再往下比了,第一个字符相等,再比较第二个字符。 

模拟实现:

#include<assert.h>
#include<string.h>

int  my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	//比较
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	if (*str1 > *str2)
		return 1;
	else
		return -1;
}
int main()
{
	const char* p1 = "abcdef";
	const char* p2 = "abqwe";
	int ret = my_strcmp(p1, p2);
	printf("%d", ret);
	return 0;
}

长度受限制的字符串函数:

strncpy(字符串拷贝)

char * strncpy ( char * destination, const char * source, size_t num );

 num的单位是字节,size_t是无符号整形

  • 拷贝num个字符从源字符串到目标空间。不把\0拷贝过去
  • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。

模拟实现这个函数自己可以做一做

strncat(字符串追加)

char * strncat ( char * destination, const char * source, size_t num );

  • 目标空间必须有足够的大,能容纳下源字符串的内容。
  • 源字符串必须以 '\0' 结束。

strncmp (字符串比较)

int strncmp ( const char * str1, const char * str2, size_t num );

strstr (查找字符串)

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

NULL--空指针      

NUL或Null-'\0' 

使用方法:

#include<string.h>
int main()
{
	const char* p1 = "abcdefhi";
	const char* p2 = "def";
	const char* ret = strstr(p1, p2);
	if (ret == NULL)
	{
       printf("子串不存在\n");
	}
	else
	{
		printf("%s\n", ret);
	}

}

没有const不行,常量字符串是无法更改的,此时p1,p2为常量指针

什么是常量指针?常量指针即是指向常量的指针,指针的值可以改变,指针所指的地址中的内容为常量不能改变,

注意事项

  • 如果字符串存在的话,返回在第一个字符串存在位置的第一个地址,
#include<string.h>
int main()
{
	const char* p1 = "abcdefabdef";
	const char* p2 = "def";
	const char* ret = strstr(p1, p2);
	if (ret == NULL)
	{
       printf("子串不存在\n");
	}
	else
	{
		printf("%s\n", ret);
	}

}

 此时出现了两个def,第一个位置的d地址被返回,从而打印defabdef

模拟实现:例如

abbbcdef

bbc

#include<string.h>
#include<assert.h>
const char* my_strstr(const char* p1, const char* p2)//开辟一个形参,我们只是找子字符串,不会更改里面内容
{
	assert(p1 != NULL);
	assert(p2 != NULL);
	//特殊情况处理  p2=""
	const char* s1 = p1;
	const char* s2 = p2;
	const char* cur = p1;
	if (*p2 == '\0')
	{
		return p1;
	}
	while (*cur)//保证p1不为空字符串
	{
		s1 = cur;
		s2 = p2;
		while ((*s1!='\0')&&(*s2 != '\0') && (*s1 == *s2))
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return cur;//找到字符串
		}
        if (*s1 == '\0')
		{
			return NULL;
		}
		cur++;
	}
	return NULL;//找不到字符串
}

int main()
{
	const char* p1 = "abcdefabdef";
	const char* p2 = "defq";
	const char* ret = my_strstr(p1, p2);
	if (ret == NULL)
	{
       printf("子串不存在\n");
	}
	else
	{
		printf("%s\n", ret);
	}

}

 这个代码有点复杂,自己可以慢慢理解;

学过数据结构可以了解一下KMP算法

 

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

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

相关文章

nginx中配置ssl证书(宝塔面板)

首先申请一个SSL证书&#xff0c;这里我申请的joyssl的免费证书。提交订单申请后&#xff0c;按照页面提示在域名解析中将CNAME和记录值配置好。 比如我用的阿里云&#xff0c; 这是好后&#xff0c;需要等几分钟&#xff0c;然后域名检验成功。 然后点击joyssl的左侧菜单的“证…

grep、sed、awk

grep&#xff1a;文本过滤工具 sed: 文本编辑工具 awk: 格式化文本 grep -n 显示行号 -i 忽略大小写 -v 取反 -o 只保留关键消息 # 找出文件的空行 grep ^$ test.txt -n # 找出文件非空行内容 grep ^$ test.txt -n -v # 找出文件非空行内容&#xff0c;并且排除注释&#xff…

大创报名步骤

目录 一、注册 二、创建项目 三、报名 一、注册 进入注册/登录 点击 点击 填写个人信息 二、创建项目 找到解压的文件 随便选一个 项目简介在你选择的文件中截取一段 询问自己寝室的人 被邀请者需要在微信公众号上搜索 “全国大学生创业服务网” 选择我的消息中同意 三、报名…

Facebook商城号怎么做?思路与操作分析

2016 年&#xff0c;Facebook打造了同名平台 Facebook Marketplace。通过利用 Facebook 现有的庞大客户群&#xff0c;该平台取得了立竿见影的成功&#xff0c;每月访问量将超过 10 亿。对于个人卖家和小企业来说&#xff0c;Facebook Marketplace是一个不错的销货渠道&#xf…

金士顿U盘被写保护的解决方法

1.适用的U盘芯片信息 USB设备ID: VID 0951 PID 1666 设备供应商: Kingston 设备名称: DataTraveler 3.0 设备修订版: 0110 产品制造商: Kingston 产品型号: DataTraveler 3.0 产品修订版: PMAP 主控厂商: Phison(群联) 主控型号: PS2251-07(PS2307) - F/W 08.03.50 [2018-…

使用python绘制日历热力图

使用python绘制日历热力图 日历热力图效果代码 日历热力图 日历热力图&#xff08;Calendar Heatmap&#xff09;是一种数据可视化图表&#xff0c;用于展示时间数据的分布和趋势。它将数据按天映射到一个日历中&#xff0c;通过颜色的变化表示每天的数据值大小。这种图表常用…

nginx平滑升级

#平滑升级 kill -USR2 <PID号> //查看nginx版本 [rootl1 logs]# nginx -v //查看nginx版本 nginx version: nginx/1.26.0 [rootl1 logs]# 安装一个1.25版本实验一下 [rootl2 ~]# cd /opt/ [rootl2 opt]# [rootl2 opt]# lsnginx-1.25.5.tar.gz nginx-1.26.0.tar.…

J-Lin烧录

1、J-linK介绍 J-Link是由德国SEGGER公司推出的&#xff0c;主要用于支持仿真ARM内核芯片的JTAG仿真器。它支持JTAG和SWD两种模式&#xff0c;可以配合多种集成开发环境&#xff08;如IAR EWAR, ADS, KEIL, WINARM, RealView等&#xff09;使用&#xff0c;支持ARM7/ARM9/ARM…

【Python编程】【Jupyter Notebook】启动时报错:no available port could be found

一、报错描述 在Jupyter Notebook中编写程序&#xff0c;无法运行&#xff0c;提示由于没有可供监听的端口&#xff0c;无法启动Jupyter服务器&#xff0c;如下图所示&#xff1a; 二、原因分析 通过报错信息&#xff0c;猜测大概是由于网络环境的原因。首先&#xff0c;关闭…

代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

一、704. 二分查找 题目链接&#xff1a;https://leetcode.cn/problems/binary-search/description/ 文章讲解&#xff1a;https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1fA4y1o715 1.…

使用Matlab软件绘制函数图像

【实验目的】 1.利用Matlab实现平面上曲线和三维空间中曲线绘制&#xff0c;重点掌握隐函数、极坐标图像绘制的相关命令。 2.利用Matlab实现三维曲面绘制&#xff0c;加深对高等数学课程所学内容的理解 【实验内容与实现】 1、用两种方法绘制下面的曲线图 &#xff08;1&am…

计算机图形学入门06:视口变换

在前面的内容中&#xff0c;在MVP变换(模型变换&#xff0c;视图变换&#xff0c;投影变换)完后&#xff0c;所有的物体位置都变换到了[-1, 1]的标准立方体里&#xff0c;下一步要把物体绘制到屏幕(Screen)上。 1.什么是屏幕&#xff1f; 对于图形学来说把屏幕抽象的认为是一个…

【微信小程序】初识小程序

项目结构 项目基本组成结构 页面基础组成结构 JSON 配置文件 App.json app.json是当前小程序的全局配置&#xff0c;包括了小程序的所有页面路径、窗口外观、界面表现、底部tab等。 在 pages 中加入路径&#xff0c;保存后&#xff0c;开发者工具可以自动帮我们创建对应的页…

VMware虚拟机关机报错处理办法

VMware虚拟机关机报错处理办法 ​ 在 VMware ESXi 下面强制关闭一个沒有反应的 VM 虚拟机的方法, 一般正常都是使用 vSphere Client 去控制 VM 虚拟机的电源开关, 但是有时会发生即使用里面的 Power Off 按钮但是还是无法关闭我的 VM 虚拟机, 而且最终会出现一串 错误信息「An…

如何使用 Python 和 Selenium 解决 Cloudflare 验证码

你知道吗&#xff1f;大约 20% 你需要抓取的网站使用 Cloudflare&#xff0c;这是一个强大且不断崛起的反机器人保护系统&#xff0c;可以轻松击败你的努力。如果你正在为 Cloudflare 验证码失败而苦恼&#xff0c;你并不孤单。在每一秒都很重要的世界里&#xff0c;许多人因为…

trace32 显示用户进程用户态调用栈

在只加载了linux vmlinux符号表的情况下&#xff0c;trace32 只能显示内核态的调用栈函数信息&#xff0c;无法显示用户态调用栈的函数信息&#xff1a; 查看进程maps 确认地址0x40616C为进程/bin/box的虚拟地址&#xff1b;而0xFFFF904E12FC为/lib/libc-2.30.so的地址&#x…

低代码开发平台一般都有哪些功能和模块?

在当今快速变化的数字化时代&#xff0c;企业对于高效、灵活且经济的软件开发解决方案的需求愈发迫切。低代码开发平台应运而生&#xff0c;成为众多企业实现数字化转型的首选工具。本文将详细探讨低代码开发平台一般具备的主要功能和模块&#xff0c;以及它们如何助力企业提升…

微软云计算[3]之Windows Azure AppFabric

Windows Azure AppFabric AppFabric概述AppFabric关键技术服务总线访问控制高速缓存 AppFabric概述 AppFabric为本地应用和云中应用提供了分布式的基础架构服务 用户本地应用与云应用之间进行安全联接和信息传递 云应用和现有应用或服务之间的连接及跨语言、跨平台、跨不同标…

GLM-4本地部署的实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

endnote IEEEtran 参考文献 输出Latex

文章目录 参考文献Latex1. 新建格式1.1 新建BibTeX Export样式文件1.2 保存自定义文献格式 2 修改2.1 修改Journal Names 为简写2.2 修改Author Lists2.3 修改 模版 Templates 3. 特殊字符作者名字标题 4. 增加期刊简写4.1 删除已有简写的Term Lists 4.2 下载最新的Term LIsts4…