常见关于数组的函数的介绍

news2024/12/26 21:40:09

关于字符串函数的介绍

求字符串长度

strlen函数

用于计算字符串的长度的函数,需要使用的库函数是string.h

函数声明
size_t strlen(const char *str)

函数模拟实现

#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* arr)
{
	assert(arr);
	int len = 0;
	while (*arr)
	{
		len++;
		arr++;
	}
	return len;
}
int main()
{
	char* arr = "asdf";
	printf("%d",my_strlen(arr));

	return 0;
}
#include<stdio.h>
#include<string.h>
int main()
{
	char* arr = "asdf";
	printf("%d", strlen(arr));

	return 0;
}

在这里插入图片描述

需要注意的是:计算的位置并不是随意的,他会计算到’\0’停止并且’\0’不计入字符总长度
在这里插入图片描述
请看这个代码,为什么会出现这中结果呢?你不是说计算到‘\0’结束吗,现在没有’\0’,可是为什么会出现相同的结果呢???
在这里插入图片描述
我们能看到内存中除了已经存好的字符之外全是’\0’,这就是为什么会是4,但是为什么会全是’\0’,因为这是c语言的规则,如果数组进行了初始化但是是未完全的初始化,那么其余的空间都将会被初始化为0

长度不受限制的字符串

strcpy()

使用的时候需要引用string.h头文件
字符串拷贝以’\0’字符为结束标志,拷贝长度不受限制,使用时需要引用库函数—string.h

函数定义

char *strcpy(char *dest, const char *src)

函数模拟实现

char* my_strcpy(char* des, const char* src)
{
	assert(des && src);
	char* res = des;

	while (*des++ = *src++);

	return res;
}

在实现的时候一定要注意将源字符串中的’\0’拷贝进去,不然会出错
未将'\0'拷贝造成错误

strcat

使用的时候需要引用string.h头文件
字符串连接函数

函数声明

char *strcat(char *dest, const char *src)

将后一个字符串放到前一个字符串的末尾,所以需要保证前一个字符串有’\0’结尾,并且写入的时候需要预留足够的空间

函数模拟实现

char* my_strcat(char* des, const char* arr)
{
	assert(des && arr);
	char* res = des;

	while (*des)des++;
	while (*des++ = *arr++);

	return res;
}

运行成功
特别需要强调的就是预留足够的空间
如果将代码写成指针的形式,那就错了!!!
因为指针没有足够的空间

#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcat(char* des, const char* arr)
{
	assert(des && arr);
	char* res = des;

	while (*des)des++;
	while (*des++ = *arr++);

	return res;
}
int main()
{
	char* arr = "hello ";
	char* arr2 = "world!";
	my_strcat(arr, arr2);
	puts(arr);
	return 0;
}

strcmp

使用的时候需要引用string.h的头文件
字符串比较函数,比较到有结果或者结尾停止

函数声明

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

此函数是使用字典序来进行比较大小的,如果a和b比较大小就是那a的ASCII码-b的ASCII码,然后进行返回(需要特殊说明的是,一般情况下返回的是不能于0的数)

函数模拟实现

#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strcmp(const char* arr1, const char* arr2)
{
	assert(arr1 && arr2);
	while (*arr1 || *arr2)
	{
		if (*arr1 != *arr2) return *arr1 - *arr2;
		arr1++;
		arr2++;
	}
	return 0;
}

运行结果

字符长度受限

strncpy,strncat,strncmp

使用的时候需要引用string.h头文件
这些函数与上面的使用方法相似,这里我们之介绍一个—strncpy

函数声明

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

当num小于source的长度–>拷贝都最后
num小于source的情况

当num大于source的长度–>在结尾的时候加上’\0’
num大于source的情况

字符查找

strstr

函数声明

char *strstr(const char *haystack, const char *needle)

使用的时候需要引用string.h头文件
用于查找字符串中needle字符串第一次出现的位置,如果有—>返回位置

找到了第一次出现的位置
如果没有—>返回NULL指针
没有找到相应的字符串

strtok

函数声明

char *strtok(char *str, const char *delim)

分割字符串函数,delim是分隔符的数组

int main()
{
	char str[] = "asdf-asdfw.asdf-svs";
	char delim[5]="-.";
	
	//使用源字符串会改变源字符串,所以不能使用源字符串
	char arr[100];
	strcpy(arr,str);
	//char* ch = strtok(str, delim);
	for (char* ch = strtok(arr, delim);ch!=NULL;ch=strtok(NULL,delim))
	{
		puts(ch);
	}
	return 0;
}

第一个参数为NULL的时候,计算机中会有一个记录上一次到达的位置,会从这个位置开始向后搜索
运行结果

strerror

使用的时候需要引用errno.h头文件
当调用库函数的时候发生错误时,错误信息会记录到errno的全局变量中

#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
	//当调用库函数发生错误,noerror会记录发生错误的原因
	FILE* pf = fopen("en.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
	}
	return 0;
}

运行结果

内存操作函数

memcpy

使用需要引用string.h头文件
在字节的层面进行复制

函数声明

void *memcpy(void *str1, const void *str2, size_t n)

函数模拟实现

void* my_memcpy(void* des, const void* src, int n)
{
	assert(des && src);
	void* res = des;

	for (int i = 0; i < n; i++)
	{
		*((char*)des + i) = *((char*)src + i);
	}

	return res;
}

运行结果
当我们想将1,2,3,4,5复制成1,2,1,2,3
但是结果却和我们想的不一样
运行错误
分析
为了解决上面的覆盖的问题,就有了下面的函数

memmove

C 库函数 void memmove(void str1, const void str2, size_t n) 从 str2 复制 n 个字符到 str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠***的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。

函数声明

void *memmove(void *str1, const void *str2, size_t n)

函数模拟实现

void* my_memmove(void* des, const void* src, int n)
{
	assert(des && src);
	void* res = des;

	if (des < src)
	{
		for (int i = 0; i < n; i++)
		{
			*((char*)des + i) = *((char*)src + i);
		}
	}
	else
	{
		while (n--)
		{
			*((char*)des + n) = *((char*)src + n);
		}
	}

	return res;
}

这样子的话是不是就是对了了呢
运行结果

多多练习

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

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

相关文章

review回文子串

给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 class Solution {List<List<String>> lists new ArrayList<>(); // 用于存储所有可能…

阿里瓴羊One推出背后,零售企业迎数字化新解

配图来自Canva可画 近年来随着数字经济的高速发展&#xff0c;各式各样的SaaS应用服务更是层出不穷&#xff0c;但本质上SaaS大多局限于单一业务流层面&#xff0c;对用户核心关切的增长问题等则没有提供更好的解法。在SaaS赛道日渐拥挤、企业增长焦虑愈演愈烈之下&#xff0c…

Midjourney助力交互设计师设计网站主页

Midjourney的一大核心优势是提供创意设计&#xff0c;这个功能也可以用在网站主页设计上&#xff0c;使用Midjourney prompt 应尽量简单&#xff0c;只需要以"web design for..." or "modern web design for..."开头即可 比如设计一个通用SAAS服务的初创企…

单片机第一季:零基础5——LED点阵

1&#xff0c;第八章-LED点阵 如何驱动LED点阵&#xff1a; (1)单片机端口直接驱动。要驱动8*8的点阵需要2个IO端口&#xff08;16个IO口&#xff09;、要驱动16*16的点阵需要4个IO端口&#xff08;32个IO口&#xff09;。 (2)使用串转并移位锁存器驱动。要驱动16*16点阵只需要…

Linux 系统编程-开发环境(二)

目录 7 压缩包管理 7.1 tar 7.2 rar 7.3 zip 8 进程管理 8.1 who 8.2 ps 8.3 jobs 8.4 fg 8.5 bg 8.6 kill 8.7 env 8.8 top 9 用户管理 9.1 创建用户 9.2 设置用户组 9.3 设置密码 9.4 切换用户 9.5 root用户 9.6 删除用户 10 网络管理 10.1 i…

MySQL-分库分表详解(七)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

【熬夜送书 | 第二期】清华社赞助 | 《前端系列丛书》

前端是什么? 前端&#xff08;Front-End&#xff09;&#xff0c;又称浏览器端、客户端等&#xff0c;是指 Web 应用程序中负责用户交互、界面展示和数据展示的部分。前端技术体系主要包括 HTML、CSS 和 JavaScript 等内容。 其中&#xff0c;HTML&#xff08;Hypertext Mar…

❀如何获得铁粉❀

文章目录 引言一、提供独特的价值1.1 分享专业知识和经验1.2 提供独特的产品或服务1.3 展示个人风格和个性 二、构建真实的关系2.1 回应评论和互动2.2 分享个人故事和经历2.3 建立信任和互信关系 三、提供独家福利3.1 提供折扣和促销3.2 推出限量版产品或服务3.3 独家活动和会员…

位运算常见算法题

文章目录 前言191. 位1的个数338. 比特位计数461. 汉明距离136. 只出现一次的数字260. 只出现一次的数字 III面试题 01.01. 判定字符是否唯一268. 丢失的数字371. 两整数之和137. 只出现一次的数字 II面试题 17.19. 消失的两个数字 前言 本篇文章会涉及多道位运算题目&#xf…

图像处理学习笔记(一)

目录 图像处理学习笔记&#xff08;一&#xff09;一、基础知识1、彩色图像&#xff08;1&#xff09;RGB&#xff08;2&#xff09;HSV&#xff08;3&#xff09;HSI&#xff08;4&#xff09;CMYK&#xff08;5&#xff09;YUV&#xff08;6&#xff09;YCbCr 2、灰度图像3、…

谋合作、创新境 | 百度参观图为科技生产全链路

当代科技的发展不断催生出新的变革和机遇&#xff0c;百度作为全球顶尖的高科技公司&#xff0c;凭借其强大的创新基因&#xff0c;一直处于人工智能领域的最前沿。   近日&#xff0c;百度公司派出了一支专业团队来到了图为科技&#xff0c;对图为的研发技术及生产线进行了全…

python 把txt文本的log日志倒序处理

在上述代码中&#xff0c;我们尝试了一系列常见的编码&#xff08;utf-8、gbk、latin-1&#xff09;来打开文件&#xff0c;直到找到一个能够成功解码文件内容的编码。 如果找到了匹配的编码&#xff0c;就使用该编码读取文件内容。如果仍然出现解码错误&#xff0c;你可能需要…

虚幻Voxel插件

虚幻Voxel插件 Voxel Plugin Voxel Plugin brings smoothed voxel terrain to Unreal Engine 4. Generate, destroy and terraform the world! 体素插件可以在虚幻引擎中生成平滑的体素地形。创造、破环和改造世界。 Terrain generation and terraforming both in game and i…

CANOE 操作详情

canoe 手把手教你如何操作canoe工具&#xff1a; 1&#xff1a;创建test文件夹&#xff0c; 并在文件夹下创建3 文件夹 2&#xff1a;创建canoe工程&#xff0c;选择500波特率 3: 双击后进入 4&#xff1a;创建DBC文件 5 创建网络节点&#xff1a; 两个节点创建好之后&#x…

mpVue 微信小程序基于vant-weapp 组件的二次封装TForm 表单组件(适配移动端)——新增仓库地址

一、前言 1、mpVue微信小程序不支持动态组件&#xff08;<component> &#xff09; 2、mpVue微信小程序不支持动态属性及事件穿透&#xff08;$attrs和$listeners&#xff09; 3、mpVue微信小程序不支持render函数 二、最终效果 三、配置参数&#xff08;Attributes&…

OpenCV for Python 入坑第一天:图像的基础操作

我们都知道&#xff0c;OpenCV能够帮助我们处理视频和图像&#xff0c;咱们在图像处理中&#xff0c;除了Pillow库之外&#xff0c;最经常用到的也是它了。那么现在咱们就正式入坑OpenCV for Python&#xff0c;一起来感受一下OpenCV的魅力吧&#xff01; 文章目录 读取图像 im…

深入了解Redis-基础篇

文章目录 一、故事背景二、知识点主要构成2.1、redis简介2.2、基于CentOS Linux docker容器化安装redis2.3、redis的数据类型2.3.1、String类型2.3.2、Hash类型2.3.3、List类型2.3.4、Set类型2.3.5、SortedSet类型 2.4、Redis的Java客户端2.4.1、Jedis2.4.1.1、Jedis的使用步骤…

leetcode 572. 另一棵树的子树(java)

另一棵树的子树 另一棵树的子树题目描述解法一 DFS解法二 KMP 算法 KMP 算法 另一棵树的子树 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/subtree-of-another-tree 题目描述 给你两棵二叉树 root 和 subRoot 。检验 …

脑电微状态方法可靠吗?

摘要 EEG微状态是在静息态EEG记录中观察到的代表功能性脑网络的状态&#xff0c;在快速切换到另一个网络之前保持稳定40-120ms。人们认为微状态特征(如持续时间、发生率、覆盖率和转换概率)可以作为精神和神经系统疾病以及心理社会特征的神经标志物。然而&#xff0c;需要可靠…

设计模式-01策略模式

1 什么是设计模式 先看一段设计模式总结之父们GOF在《设计模式 可复用面向对象软件的基础》一书中描述的一段话&#xff1a; 设计模式就是程序编码设计时的一些套路&#xff0c;这些套路都是经过前人千锤百炼总结出来的经验&#xff0c;由GoF总结出23种经典套路&#xff0c;即…