C/C++字符函数和字符串函数详解————长度受限制的字符串函数

news2024/11/27 21:42:54

个人主页:点我进入主页

专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶

C语言刷题

欢迎大家点赞,评论,收藏。

一起努力,一起奔赴大厂。

目录

1.前言        

2.长度受限制的字符串函数

2.1strncpy函数

2.2strncat函数

2.3strncmp函数

2.4小结

3.特殊的字符串函数

3.1strstr函数

3.2strtok函数


1.前言        

        在上一篇文章中我们讲过了长度不受限制的字符串函数,包括strlen函数,strcmp函数,strcpy函数,strcat函数,学过和没学过的老铁们可以点击长度不受限制的字符串函数

今天我们我们就讲讲长度受限制的字符串函数,包括strncpy函数,strncat函数,strncmp函数,在这些函数中长度受限制是需要我们加上要修改的字节数。还有一些特殊的函数包括strstr函数,strtok函数。今天就来看看我们的内容吧。

2.长度受限制的字符串函数

2.1strncpy函数

我们进入cplusplus函数可以看到strnpcy函数的参数。

        strncpy函数的返回类型是char*,他的参数是 char * destination, const char * source, size_t num,在这里对于source由于不需要进行修改,只是需要进行拷贝,所以加上const,对于size_num是需要将source字符串的num个字节进行拷贝到destination,在第一个字节处进行修改,详细的代码如下:

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = "abcdefghigh";
	char brr[] = "zzzzz";
	strncpy(arr, brr, 4);
	printf("%s", arr);
	return 0;
}

 我们运行查看

我们发现字符串arr的前4个字节修改为字符串的前4个字节。

2.2strncat函数

同样我们进入cplusplus函数查看它的参数。

        strncat函数的返回值是char*,它的参数是 char * destination, const char * source, size_t num

和函数strncpy函数,由于source函数不需要进行修改,所以用const函数进行修改,在size_t num是需要连接的字符的个数,详细的代码如下:

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[100] = "abcdefghigh";
	char brr[] = "xzzzzz";
	strncat(arr, brr, 4);
	printf("%s", arr);
	return 0;
}

我们运行代码可以看到:

在这里我么的字符串brr是source,把他的前4个字符连接到字符串arr后面,同时拷贝一下‘\0’;

2.3strncmp函数

我们进入cplusplus网站

        我们可以看到strncmp的参数是const char * str1, const char * str2, size_t num,由于str1和str2不需要进行修改,只需要进行比较,所以用const进行修饰,size_t是需要比较的字符串的个数。对于strncmp函数的返回值是int类型,

         如果第一个大于第二个返回大于0的数据,如果第一个小于第二个返回小于0的数据,如果第一个等于第二个则返回0,注意这里的比较是对于前num个字符进行比较,比较的形式和前面的额strcmp一样,具体的代码演示如下:

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = "abcdefghigh";
	char brr[] = "abce";
	int ret=strncmp(arr, brr, 4);
	printf("%d", ret);
	return 0;
}

我们运行可以看到:

函数的返回值是-1。

2.4小结

        对于这三个函数,他们和长度不受限制的类似,只是多了一个限制条件,这个限制条件是限制的source.也就是说num是几个就拷贝几个,里面的循环由遇到‘\0’的while循环,改为了for循环,判定是i<num。

3.特殊的字符串函数

3.1strstr函数

        strstr函数是一个查找子串的函数,它返回最早出现字串的位置,我们进入cplusplus网站进行查看,

        我们看第一条,它参数和返回值都用const进行修饰,事实上他们两条都一样,只是第一条用const进行修饰,让它的值不能改变,更加的安全,防止非法的修改。我们举个例子来感受一直strstr函数的应用,代码如下:

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = "abcabcdefghigh";
	char brr[] = "abcd";
	char *crr=strstr(arr, brr);
	printf("%s", crr);
	return 0;
}

我们运行可以看到:

我们想要模拟实现,首先画一下它的思路:

        就是由str2和str1进行记录位置,s1和s2进行比较,不相等str1和s1进行移动,相等str1和str2不动,s1和s2进行移动,相等移动,不相同重新指向str1和str2 ,依次循环,直到str1遇到‘\0’,模拟实现如下:

#include <stdio.h>
char* my_strstr(char* arr, char* brr)
{
	char* str1 = arr, * s1 = arr, * str2 = brr, * s2 = brr;
	while (*str1)
	{
		if (*s2 == '\0')
		{
			return str1;
		}
		if (*s1 == *s2)
		{
			s1++;
			s2++;
		}
		else
		{
			str1++;
			s1 = str1;
			s2 = str2;
		}
	}
}
int main()
{
	char arr[] = "abcabcdef";
	char brr[] = "abcd";
	char* p = my_strstr(arr, brr);
	printf("%s", p);
	return 0;
}

3.2strtok函数

        

        我们可以看到,strtok函数返回类型是char*,它的参数是 、char * str, const char * delimiters,这个函数是字符串切割,需要两个字符串,第一个字符串中出现第二个字符串就会进行切割然后指向此段的首字符,具体的代码如下:

#include <string.h>
#include <stdio.h>
int main()
{
	char arr[] = "abc,abcd@efacd*add";
	char brr[] = ",@*";
	char* str = arr;
	for (str = strtok(arr, brr); str != NULL; str = strtok(NULL, brr))
	{
		printf("%s\n", str);
	}
	return 0;
}

今天的内容就结束了,希望大家可以一键三连。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

arm 汇编基础指令

实现1-100求和 .text .globl _start_start:mov r0, #1 i&#xff0c;i1mov r1, #100 条件变量i<100mov r2, #0 sumLoop: 循环cmp r0,r1 比较r0和r1的大小bhi stop 当r0>r1时&#xff0c;跳到stop标签a…

Ubuntu服务器安全性提升:修改SSH默认端口号

在Ubuntu服务器上&#xff0c;SSH&#xff08;Secure Shell&#xff09;是一种至关重要的远程连接工具。它提供了一种安全的方式来远程连接和管理计算机系统&#xff0c;通过加密通信来确保数据的保密性和完整性。SSH协议广泛用于计算机网络中&#xff0c;用于远程管理、文件传…

什么是 MyBatis?与 Hibernate 的区别

引言 在现代的应用程序开发中&#xff0c;与数据库的交互是至关重要的。为了简化数据库访问&#xff0c;许多开发者选择使用ORM&#xff08;对象-关系映射&#xff09;框架。MyBatis和Hibernate都是流行的ORM框架&#xff0c;它们可以帮助开发者更轻松地将Java对象映射到数据库…

Springboot+vue的球队训练信息管理系统(有报告),Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的球队训练信息管理系统&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的球队训练信息管理系统&#xff0c;采用M&…

选择排序、冒泡排序、快速排序、归并排序

1、选择排序 设一个数据集有n个元素&#xff0c;选择这n个元素中最小的一个与第一个元素交换位置&#xff0c;再在剩下的n-1个元素中选择最小的一个与第二个元素交换位置&#xff0c;直到在最后两个元素中选择最小的一个放在倒数第二的位置上&#xff0c;简单选择排序是不稳定…

【Arduino ESP32教程入门】Note

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析3 目录 &#x1f449;&#x1f3fb;arduino开发板引脚USB串行总线串行总线和并行总线的优…

Kerberos常见报错汇总

一.kdb5_util: Password mismatch while reading master key from keyboard 1>.错误复现 2>.错误原因分析 在初始化Kerberos数据库时需要输入密码&#xff0c;2次密码输入不一致就会导致该错误。 3>.解决方案 重新执行"kdb5_util -r YINZHENGJIE.COM create -s…

读书笔记--知识图谱基础概念与关键环节解析

知识图谱相当于一张网&#xff0c;是一种大型知识库&#xff0c;一种揭示实体之间关系的语义网络&#xff0c;是事物及其关系的形式化描述&#xff0c;分为通用知识图谱和领域&#xff08;行业&#xff09;知识图谱&#xff0c;如DBpedia&#xff0c;OpenKG&#xff0c;Wikidat…

IP行业查询API:为用户分析提供帮助

引言 在数字化时代&#xff0c;IP地址不仅代表着设备在互联网上的位置&#xff0c;还蕴含着丰富的信息。IP地址所属行业查询API应运而生&#xff0c;为用户分析提供了有力支持。本文将探讨这一工具的应用&#xff0c;以及对用户分析的帮助。 IP行业API的应用 1. 目标市场定位…

凉鞋的 Unity 笔记 102. 场景层次 与 GameObject 的增删改查

102. 场景层次 与 GameObject 的增删改查 在上一篇&#xff0c;我们完成了 Unity 引擎的 Hello world 输出&#xff0c;并且完成了第一个基本循环&#xff1a; 通过这次基本循环的完成&#xff0c;我们获得了一点点的 Unity 使用经验&#xff0c;这非常重要。 有实践经验后再…

C++(string类)

本节目标&#xff1a; 1、为什么要学习string类 2.标准库中的string类 3.vs和g下string结构说明 1.为什么学习string类 1.1 c语言中的字符串 C 语言中&#xff0c;字符串是以 \0 结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c; C 标准库中提供了一些 str系列的…

ROS2 库包设置和使用 Catch2 进行单元测试

说明 本文的目的是了解如何在 ROS2 中创建库&#xff0c;以供其他 ROS2 包使用。除此之外&#xff0c;本文还介绍了如何使用 catch2 框架编写单元测试。本文的第 1 部分将详细介绍如何创建库包。第 2 部分将介绍 ROS2 软件包如何利用创建的库 上篇 ROS2 库包设置和使用 Catch2…

postgresql-管理数据表

postgresql-管理数据表 创建表数据类型字段约束表级约束模式搜索路径 修改表添加字段删除字段添加约束删除约束修改字段默认值修改字段数据类型重命名字段重命名表 删除表 创建表 在 PostgreSQL 中&#xff0c;使用 CREATE TABLE 语句创建一个新表&#xff1a; CREATE TABLE …

二、BurpSuite Scan扫描

1.Scan details 解释&#xff1a;选择只是爬行还是爬行加代码审计 Scan Type&#xff1a;选择爬行或者代码审计URLs to scan&#xff1a;定义要扫描的网址。Burp将从这些网址开始进行爬行&#xff0c;并默认将包括指定网址文件夹下的所有内容。Protocol settings&#xff1a;使…

【Office】超简单,Excel快速完成不规则合并单元格排序

演示效果&#xff1a;将下图已经合并了的单元格按照单位名称排序并将同一个单位的数据合并在了一起。 Step 1&#xff1a;取消合并 选中所有的数据后&#xff0c;点击 “开始”-“合并单元格” &#xff0c;并且取消数据源的合并。 Step 2&#xff1a;填充数据 选中需要填…

宝塔反代openai官方API接口详细教程,502 Bad Gateway问题解决

一、前言 宝塔反代openai官方API接口详细教程&#xff0c;实现国内使用ChatGPT502 Bad Gateway问题解决&#xff0c; 此方法最简单快捷&#xff0c;没有复杂步骤&#xff0c;不容易出错&#xff0c;即最简单&#xff0c;零代码、零部署的方法。 二、实现前提 一台海外VPS服务…

Python Cartopy地图投影【3】

上两期文章见&#xff1a; Python Cartopy地图投影【1】 第一期文章内容纲要&#xff1a; step1: 开始地图投影 step2: GeoAxes 的常用方法 2.1 add_feature&#xff1a;添加海岸线、河流、湖泊等地理特征 2.2 gridlines&#xff1a;添加网格线以及相应标签等 Python Cartopy地…

最新AI智能创作系统ChatGPT商业源码+详细图文搭建部署教程+AI绘画系统

一、AI系统介绍 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&am…

深度学习(2)---循环神经网络(RNN)

文章目录 一、序列数据和语言模型1.1 序列数据1.2 语言模型 二、循环神经网络(RNN)2.1 概述2.2 门控循环单元(GRU)2.3 长短期记忆网络(LSTM) 一、序列数据和语言模型 1.1 序列数据 1. 在深度学习中&#xff0c;序列数据&#xff08;Sequence data&#xff09;是指具有前后顺序…

华为:数据治理方法论

导读 本文先概要介绍了数据治理框架、数据治理组织架构和数据治理度量评估体系&#xff0c;然后结合华为数据治理案例和新冠疫情简单描述了数据治理的应用&#xff0c;最后描述了DAYU方法论在DataArts Studio产品上的落地以及详细的落地指导文档。 加gzh“大数据食铁兽”&am…