字符函数和字符串函数

news2024/11/15 9:24:43

🌱博客主页:大寄一场.

🌱系列专栏:C语言学习笔记

😘博客制作不易欢迎各位👍点赞+⭐收藏+➕关注


目录

 前言

一、字符串函数

1. 1 strlen

2. 长度不受限制的字符串函数(操作的是整个字符串)

2.1 strcpy

2.2 strcat

 2.3 strcmp

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

3.1 strncpy

3.2 strncat

3.3 strncmp

4. 字符串查找

4.1 strstr

4.2 strtok

5.错误信息报告

5.1strerror

二、字符函数

字符分类函数:

字符转换:

三、内存操作函数

1. memcpy

2. memmove

总结


 

 

 

 前言

   在C语言中,字符串是没有类型的,通常我们将字符串放在字符数组当中,同时,我们对于字符串的操作是很频繁的,因为对于字符串的操作频繁,所以C语言本身提供了一些对字符串进行处理的库函数。如下:

函数作用
strlen求字符串长度
strcpy复制字符串
strcat横向连接字符串
strcmp比较两个字符串的大小,返回比较的结果
strncpy复制字符串
strncat字符串的结尾追加n个字符
strncmp比较两个字符串的大小
strstr搜索一个字符串在另一个字符串中的第一次出现。找到所搜索的字符串,则该函数返回第一次匹配的字符串的地址; 如果未找到所搜索的字符串,则返回NULL。
strtok将字符串分割成一个个片段
strerror将错误码给转化成错误信息
memcpy内存拷贝
memmove拷贝一定长度的内存的内容
memset在一段内存块中填充某个给定的值
memcmp

比较两个内存块


一、字符串函数

1. 1 strlen

size_t strlen (const char* str);

该函数要注意的细节点如下:

1)字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包
含 '\0' );

2)参数的字符串必须要以“ \0 ”结束,不能没有“ \0 ”;

3)注意函数的返回值是 size_t ,是无符号的。

size_t 实际就是无符号整型,虽然没有确切的证明,但是根据推测,size_t 就是对   unsigned int 的重命名而已,并不是一种新的数据类型。

函数实现:

/*模拟实现strlen*/
size_t my_strlen(const char* ch)
{
	assert(ch);
	size_t count = 0;
	while (*ch++)
	{
		count++;
	}
	return count;
}

2. 长度不受限制的字符串函数(操作的是整个字符串)

2.1 strcpy

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

该函数要注意的细节点如下: 

1)源字符串必须以 '\0' 结束;
2)该函数会将源字符串中的“ \0 ”一同拷贝到目标空间,如果目标字符串原先就有内容,就会被拷贝的内容覆盖掉,包括“ \0 ”也是;
3)目标空间必须足够大,以确保能存放源字符串,如果放不下就会造成数组越界访问,为非法访问空间;
4)目标空间必须可变,不能是常量字符串。

函数实现:

/*模拟实现strcpy*/
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
	char* p = dest;
	assert(src != NULL);
	assert(dest != NULL);
	while(*dest++ = *src++)
	{
		;
	}
	return p;
 }

2.2 strcat

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

该函数要注意的细节点如下: 

1)源字符串必须以 '\0' 结束;
2)目标空间必须有足够的大,能容纳下源字符串的内容;
3)目标空间必须可修改。

函数实现:

/*模拟实现strcat*/
#include<assert.h>
char* my_strcat(char* des, const char* src)
{
	char* p = des;
	assert(des && src);
	while (*des++)
	{
		;
	}
	des--;
	while (*des++ = *src++)
	{
		;
	}
	return p;
}

 2.3 strcmp

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

该函数要注意的细节点如下: 

1)第一个字符串大于第二个字符串,则返回大于0的数字;
2)第一个字符串等于第二个字符串,则返回0;
3)第一个字符串小于第二个字符串,则返回小于0的数字。

ps:在 VS 环境中,第一种情况返回的是 1 ,第二种情况同样返回 0 ,第三种情况返回 -1 。
函数实现:

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1++ == *str2++)
	{
		if (*str2 == '\0')
		{
			return 0;
		}
	}
	str1--;
	str2--;
	return *str1 - *str2;
}

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

 ps:上面的三个函数操作的都是整个字符串,而接下来的三个函数就像是它们的衍生版本,可以操作整个字符串,也可以操作字符串的部分内容。

3.1 strncpy

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

需要注意的细节点有:

1)如果源字符串的长度小于 num ,则拷贝完源字符串之后,在目标的后边追加 0 ,直到 num 个;

2)拷贝 num 个字符就只会拷贝 num 个字符,不会再往后补上一个"\0 "。

3.2 strncat

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

需要注意的细节点有:

同样地,这个函数与 strcat 在使用上也只有新增一个参数来确认需要追加字符串中的多少个字符的区别而已,这个函数使用起来就比 strncpy 省心多了,因为这个函数会在追加之后再追加一个    “ \0 ”。

3.3 strncmp

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

这个函数使用方法与 strcmp 相比也只有最后一个参数的区别,不多加说明。

4. 字符串查找

4.1 strstr

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

这是一个可以判断一个字符串是否是另一个字符串的子串的函数。如果 str2 是 str1 的子串,即返回 str2 在 str1 中首次出现的位置的地址。这个函数使用起来很简单方便,并且也没有太多需要注意的细节,只需正常使用即可。 

函数实现:

char* my_strstr(const char* ch1, const char* ch2)
{
	assert(ch1 && ch2);
	const char* cp1 = ch1;
	const char* cp2 = ch2;
	const char* p = ch1;
	while (*p)
	{
		cp2 = ch2;
		cp1 = p;
		while (*cp1!='\0'&&*cp2!='\0'&& * cp1 == *cp2)
		{
			cp1++;
			cp2++;
		}
		if (*ch2 == '\0')
		{
			return (char*)p;
		}
		p++;
	}
	return NULL;
}

4.2 strtok

char* strtok (char* str, const char* sep);

 strtok,是一个特殊的函数,它可以将字符串分割,按照我们给出的分隔符分隔,我们进行第一次传参的时候,把字符串传过去,然后开始找分隔符,找到分隔符用'\0'代替,当要进行第二次分割的的时候,传参传空指针即可,当传参传空指针的时候,我们的strtok函数会找到上一次标记的地址,然后向后进行切割,如果在我们的字符串中,没有我们的分隔符,就会返回一个空指针

5.错误信息报告

5.1strerror

char * strerror ( int errnum );

strerror是一个用来报告错误的函数,它可以将错误码转换成错误信息,其中我们的错误码会保存在一个叫做errno的函数中,它需要引头文件<errno.h>。

二、字符函数

字符分类函数:

函数如果他的参数符合下列条件就返回真
iscntrl任何控制字符
isspace空白字符:空格‘ ’,换页‘\f’,换行'\n',回车‘\r’,制表符'\t'或者垂直制表符'\v'
isdigit十进制数字 0~9
isxdigit十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F
islower小写字母a~z
isupper大写字母A~Z
isalpha字母a~z或A~Z
isalnum字母或者数字,a~z,A~Z,0~9
ispunct标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符


字符转换:

大写 -> 小写:tolower

int tolower (int c);

小写 -> 大写:toupper

int toupper (int c);

三、内存操作函数

1. memcpy

void* memcpy (void* destination, const void* source, size_t num);

需要注意的细节点有:

1)函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置;
2)这个函数在遇到 '\0' 的时候并不会停下来;
3)如果source和destination有任何的重叠,复制的结果都是未定义的。

函数实现:


void* my_memcpy(void* dest, const void* src, size_t num)
{
	void* p = dest;
	assert(dest && src);
	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return p;
}

2. memmove

void* memmove (void* destination, const void* source, size_t num);

需要注意的细节点有:

1)和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的;
2)如果源空间和目标空间出现重叠,就得使用memmove函数处理。


 函数实现:

void* my_memmove(void* dest, const void* src, size_t num)
{
	void* p = dest;
	assert(dest && src);
	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return p;
}

 3. memcmp

int memcmp (const void* ptr1, const void* ptr2, size_t num);

 需要注意的细节点有:

1)比较从ptr1和ptr2指针开始的num个字节;

2)返回值如下:(用到了msdn这个软件)

 


总结

上述的这些都是我们经常会在平时的代码中使用到的,熟练掌握起来为我们提供很大的帮助。当然,除此之外,C语言的库函数中还有许多有趣的有关字符和字符串的函数,如果你有兴趣想要了解,可以在下面的网站或软件找到它们,里面都有对每一个函数详细的各个部分的说明、作用的解析和示例,博主就不一一赘述了。链接如下:

cplusplus : cplusplus.com - The C++ Resources Network

cpprefrernce:    cppreference.com

如果前俩个网址加载太慢也可以安装 MSDN 这个软件,这个软件也十分简洁方便,也可自行切换中文。

链接:https://pan.baidu.com/s/114FzIxhZWLUwFKSc01W3Rw?pwd=lsgb 
提取码:lsgb 

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

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

相关文章

Linux-用户权限相关命令

1.用户和权限的基本概念1.1基本概念用户是Linux系统工作中重要的一环&#xff0c;用户管理包括用户与组管理在Linux系统中&#xff0c;不论是由本机或是远程登录系统&#xff0c;每个系统都必须拥有一个账号&#xff0c;并且对于不同的系统资源拥有不同的使用权限在Linux中&…

DAMA数据管理知识体系指南之数据操作管理

第6章 数据操作管理 6.1 简介 数据操作管理是结构化数据的开发、维护和支持的活动&#xff0c;使企业数据资源达到最佳的利用价值。数据操作管理包括两项子职能&#xff1a;数据库支持和数据技术管理。 数据操作管理的目标是&#xff1a; &#xff08;1&#xff09;保护和确保…

SpringBoot 如何保证接口安全?老鸟们都是这么玩的!

大家好&#xff0c;我是飘渺。 对于互联网来说&#xff0c;只要你系统的接口暴露在外网&#xff0c;就避免不了接口安全问题。如果你的接口在外网裸奔&#xff0c;只要让黑客知道接口的地址和参数就可以调用&#xff0c;那简直就是灾难。 举个例子&#xff1a;你的网站用户注册…

【NS2学习笔记】tcl与c++互相调用/传参

在NS2&#xff0c;做实验的时候&#xff0c;为了能通过循环配合传值实验&#xff0c;一直找不到tcl传参给c的方法&#xff0c;网上的只po出一部分看不懂&#xff0c;只能通过源码自己研究。最后的解决办法就是&#xff0c;模仿源码的操作&#xff0c;以下通过tcl→ex→sat-irid…

Python如何删除列表中的重复元素?

嗨嗨&#xff0c;大家晚上好 ~ 又来给你们分享小妙招啦 在python列表有重复元素时&#xff0c;可以有以下几种方式进行删除 觉得不错的话&#xff0c;赶紧学起来用用吧 &#xff01; 直接遍历列表删除 l1 [1, 1, 2, 2, 3, 3, 3, 3, 6, 6, 5, 5, 2, 2]for el in l1:if l1.coun…

Java之动态规划的背包问题

目录 动态规划问题 一:01背包问题 1.问题描述 2.分析问题 3.代码实现(二维数组) 4.滚动数组实现(一维数组) 二:完全背包问题 1.题目描述 2.问题分析 3.代码实现 动态规划问题 动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题,进行解决&#xff…

若依代码生成器-Domain代码生成篇(一)

若依代码生成器的前一段代码的阅读&#xff0c;我们了解了若依代码生成器的一些逻辑&#xff0c;包括通过数据库的information_schema. TABLES查询表信息&#xff0c;以及information_schema. COLUMNS查询指定表的列信息&#xff0c;将其转换到表gen_table与gen_table_column中…

SETR项目运行记录

项目简要介绍 全称为Swin-Transformer-Semantic-Segmentation&#xff0c;看名字我们就知道使用的是transformer&#xff0c;做的是语义分割方面&#xff0c;使用的数据集是Cityscapes。在本文中我们并不对其原理进行解读&#xff0c;只是调试运行该项目。 项目下载地址&#…

2023年深圳CPDA数据分析师认证将于2/25正式开班,快来报名

CPDA数据分析师认证是中国大数据领域有一定权威度的中高端人才认证&#xff0c;它不仅是中国较早大数据专业技术人才认证、更是中国大数据时代先行者&#xff0c;具有广泛的社会认知度和权威性。 无论是地方政府引进人才、公务员报考、各大企业选聘人才&#xff0c;还是招投标加…

C++这么难,为什么我们还要学习C++?

文章目录前言1. 为什么难学2. C的意义3. 什么时候该用C4. 如何学习C5. 学前勉言前言 C 可算是一种声名在外的编程语言了。这个名声有好有坏&#xff0c;从好的方面讲&#xff0c;C 性能非常好&#xff0c;哪个编程语言性能好的话&#xff0c;总忍不住要跟 C 来单挑一下&#x…

[架构之路-98]:《软件架构设计:程序员向架构师转型必备》-8-确定关键性需求与决定系统架构的因素

第8章 确定关键性需求是什么决定了软件系统的架构&#xff1f;&#xff01;没有大的争议的是&#xff1a;需求决定了软件系统的架构&#xff01;那么什么样的需求对软件系统的架构影响最大&#xff1f;8.1 众说纷纭——什么决定了架构8.1.1 用例驱动论&#xff1a;功能性需求用…

算法训练营 day30 回溯算法 组合总和 组合总和II 分割回文串

算法训练营 day30 回溯算法 组合总和 组合总和II 分割回文串 组合总和 39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组…

简易三子棋游戏实现

哈喽小伙伴们大家好&#xff0c;我们一起学习三子棋游戏的创建吧。在开始之前我们先来复习一下&#xff0c;函数声明放在头文件中函数定义放在源文件中。那么什么是函数声明和函数定义呢&#xff1f;所谓函数声明就是说明函数的返回参数&#xff0c;函数类型&#xff0c;函数名…

基于PHP的图书管理系统

摘要网络技术给生活带来了十分的便利。所以把图书管理与现在网络相结合。在图书馆发展的整个过程中&#xff0c;图书担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类管理系统程序也在不断改进。本课题所设计的图书管理系统&#xff0c;使用B/S架构&#xff…

C++之this指针

this指针到底是什么&#xff1f;this 实际上是成员函数的一个形参&#xff0c;在调用成员函数时将对象的地址作为实参传递给 this。不过 this 这个形参是隐式的&#xff0c;它并不出现在代码中&#xff0c;而是在编译阶段由编译器默默地将它添加到参数列表中。我们操作一个对象…

Hadoop配置手册1:hadoop环境搭建与测试

Hadoop配置手册1 Date: September 25, 2022 第1章 hadoop环境搭建 1.1 安装Vmware软件 下载地址&#xff1a;https://www.onlinedown.net/soft/45831.htm 运行安装程序&#xff0c;并连续点击下一步安装 输入密钥&#xff0c;启动程序 详细参考&#xff1a;https://blog.csd…

2023年19个数学建模竞赛重磅来袭!!!

更新时间&#xff1a;2022年2月3日 本人的团队全是计算机的研究生&#xff0c;从本科到研究生有丰富的打比赛和数模的经验&#xff0c;有需要指导的&#xff0c;请私信我 相关链接 &#xff08;1&#xff09;【数学建模】2022年整年所有数学建模竞赛时间表 &#xff08;2&a…

再过半小时,你就能理解Kafka的基本原理了

kafka总结一.定义二.基础架构及术语三.工作流程分析3.1发送数据3.2保存数据3.2.1 partition结构3.2.2 message结构3.2.3 存储策略3.2.4 消费数据一.定义 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;可以处理消费者规模的网站中的所有动作流数据&#xff0c;具有…

基于 PyTorch 的目标检测(YOLO实现)

目标检测是一个直到最近才开始逐渐被征服的挑战。解决这个问题对于自动化和自动驾驶来说是至关重要的。对解决办法的追求导致了各种方法的发展。我想要描述一些主要的方法&#xff0c;在过去的21目标检测已经被使用&#xff0c;然后讨论 Yolov3的实现。讨论方法引言虽然深度学习…

windows 7 离线安装vs20219,GraalVM 打包java成可执行程序

环境准备 由于vs2022不支持windows 7 &#xff0c;故用vs2019版。 如果是 win7 系统&#xff0c;在安装下载的依赖项前需要安装 win7 所需要的两个补丁 KB4490628和KB4474419 &#xff0c;下载地址分别为&#xff08;下载后直接安装即可&#xff09;&#xff1a; 参考这篇博客…