【C语言】字符串函数(一)

news2024/10/5 22:22:12

目录

         一、strlen函数(计算字符串长度)

               1、strlen函数的用途

               2、strlen函数的使用

               3、strlen函数的模拟实现

         二、strcpy函数(字符串拷贝)

               1、strcpy函数的用途

               2、strcpy函数的使用

               3、strcpy函数的模拟实现

         三、strcat函数(字符串追加)

               1、strcat函数的用途

               2、strcat函数的使用

               3、strcat函数的模拟实现

         四、strcmp函数(两个字符串比较)

               1、strcmp函数的用途

               2、strcmp函数的使用

               3、strcmp函数的模拟实现

一、strlen函数(计算字符串长度)

        1、strlen函数的用途

它是计算字符串长度的库函数,由下面的图片可知用法:

返回值size_t 是unsigned int (无符号整型)通过重命名后的类型。

const的用法:const char* str,const修饰在* 前,表示 *str不可以被改变,str可以改变。如果改成char * const str ,const修饰在*的后面,表示str不可改变,*str可以被改变。

注意:

strlen 函数接受字符串地址时,从该地址往后计算字符的个数直到遇到 ‘\0’ 结束,‘\0’ 是字符串结束的标志,它不再计算的范围个数内。

        2、strlen函数的使用

int main()
{
	const char* str1 = "abcdef";
	int ret = strlen(str1);
	printf("长度为:%d\n", ret);
	return 0;
}

 但是在这里有个容易出错的例题如下:

int main()
{
	const char* str1 = "abcdef";
	const char* str2 = "bbb";
	if (strlen(str2) - strlen(str1) > 0)
	{
		printf("str2>str1\n");
	}
	else
	{
		printf("srt1>str2\n");
	}
	return 0;
}

解析:

在这里大家有的会认为是str1 > str2,但是这里的结果值str2 > str1,为什么呢?因为strlen函数的返回值是无符号整形,所以在相减过程任然是无符号整形,所以大于0,然后就执行第一条语句。

        3、strlen函数的模拟实现

分析一下:因为这个strlen函数是以‘\0’作为结束的标志,所以先设置一个变量用作计数,当*str不为0时,往后移,然后count++,直到遇到‘\0’结束,跳出循环。

int my_strlen(const char* str)
{
	int count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}

二、strcpy函数(字符串拷贝)

        1、strcpy函数的用途

它是用来拷贝字符串的库函数,由下面的图片可知详细用法:

 注意:

1、源字符串必须以 '\0' 结束。

2、会将源字符串中的 '\0' 拷贝到目标空间。

3、目标空间必须足够大,以确保能存放源字符串。

4、目标空间必须可变。

        2、strcpy函数的使用

int main()
{
	char arr1[] = "XXXXXXXX";
	char arr2[] = "abcde";
	strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

运行结果:

        3、strcpy函数的模拟实现

在while循环的小括号内,有一个赋值表达式,这个表达式是先将字符赋值给dest ,当赋值表达式执行成功后,根据*dest的值进行条件判断。这样下来就形成了一种,先赋值后判断的循环逻辑,同时,当赋值结束时,进行后置加加,赋值下一个字符。因此当遇到‘\0’的时候先将其赋值给目标空间,然后再利用目标空间内的‘\0’进行条件判断,终止循环。

char* my_strcpy(char* dest, const char* src)
{
	assert(dest != NULL);
	assert(src != NULL);
	char* ret = dest;
	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}

三、strcat函数(字符串追加)

        1、strcat函数的用途

它是在一个字符串后面追加另一个字符串的库函数,由下面的图片可知详细用法:

注意:

1、源字符串必须以 '\0' 结束。

2、目标空间必须有足够的大,能容纳下源字符串的内容。

3、目标空间必须可修改。

4、字符串自己不可以给自己追加。

        2、strcat函数的使用

int main()
{
	char str1[20] = "aaaaa";
	char str2[] = "bbbbb";
	strcat(str1, str2);
	printf("%s\n", str1);
	return 0;
}

运行如下:

        3、strcat函数的模拟实现

这个和上面的strcpy很相似,它需要先判断要追加字符串的结束位置,然后再进行赋值。

char* my_strcat(char* dest, const char* src)
{
    assert(dest != NULL);
	assert(src != NULL);
	char* ret = dest;
	while (*dest)
	{
		dest++;
	}
	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}

四、strcmp函数(两个字符串比较)

        1、strcmp函数的用途

它用来比较两个字符串的大小的库函数,由下面的图片可知详细用法:

这个函数在平时是很常用的,我们需要注意的是这个函数的比较规则,这个函数会从两个字符串的第一位开始比较,比较的是二者的ASCII码值,如果二者不同,那么就直接返回对应的结果。如果相同,则继续比较第二位元素对应字符的ASCII码值,直到比出差异。假如整个字符串都和另外一个字符串相等,那么就会返回0,代表二者相同。

 标准规定:

1、第一个字符串大于第二个字符串,则返回大于0的数字

2、第一个字符串等于第二个字符串,则返回0

3、第一个字符串小于第二个字符串,则返回小于0的数字

        2、strcmp函数的使用

int main()
{
	char str1[] = "abcdef";
	char str2[] = "ade";
	int ret = strcmp(str1, str2);
	if (ret > 0)
	{
		printf("str1>str2\n");
	}
	else if (ret < 0)
	{
		printf("str1<str2\n");
	}
	else
	{
		printf("str1=str2\n");
	}
	return 0;
}

运行如下:

 

        3、strcmp函数的模拟实现

int my_strcmp(const char* s1, const char* s2)
{
	assert(s1 && s2);
	while (*s1 == *s2)
	{
		if (*s1 == '\0')  //当s1=='\0'的时候s1与s2相等
		{
			return 0;
		}
		s1++;
		s2++;
	}
	return *s1 - *s2;
}

本文要是有不足的地方,欢迎大家在下面评论,我会在第一时间更正。

老铁们,记着点赞加关注哦!!!

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

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

相关文章

【JavaSE】接口剩余内容

目录 1、接口使用实例 &#x1f4d5;逐步分析学生数组排序的写法 ✨思路&#xff1a; ✨代码实现 ✨弊端 &#x1f4d5;、改进 改进思路&#xff1a; 代码实现&#xff1a; 2、Cloneable接口和深拷贝 2.1、cloneable接口的作用 2.2、深拷贝和浅拷贝 2.2.1、浅拷贝 …

yum安装openldap2.4.44,并配置增量复制(Delta-syncrepl)环境

本文是在centos7环境下通过yum安装openldap2.4.44&#xff0c;并配置增量复制&#xff08;Delta-syncrepl&#xff09;环境 官网对于增量复制介绍&#xff1a;https://www.openldap.org/doc/admin24/replication.html#Delta-syncrepl%20replication Delta-syncrepl 是 syncrep…

ADI Blackfin DSP处理器-BF533的开发详解3:GPIO(含源代码)

我们从最基础的GPIO开始&#xff0c;先讲外设&#xff0c;这玩意不管是单片机&#xff0c;还是ARM&#xff0c;又或是FPGA&#xff0c;甚至SOC的芯片&#xff0c;都有GPIO&#xff0c;有共性&#xff0c;就好理解&#xff0c;让我们看看在ADI的DSP里头&#xff0c;GPIO是怎么一…

MySQL数据库学习(2)

一.MySQL语法书写规范&#xff1a; (1).SQL语句要以分号;结尾 在 RDBMS(关系型数据库)当中&#xff0c;SQL语句是逐条执行的&#xff0c;一条 SQL语句代表着数据库的一个操作。SQL语句是使用英文分号;结尾。 (2).SQL语句不区分大小写 SQL不区分关键字的大小写。例如&#xff0c…

CentOS7下mysql主从复制搭建

mysql安装 CentOS7安装MySql5.7完整教程_长头发的程序猿的博客-CSDN博客_centos7 mysql5.7安装 1、配置主机 1.1、修改my.cnf配置文件 vim /etc/my.cnf 最后一行添加&#xff1a; #主服务器唯一ID server-id1 #启用二进制日志 log-binmysql-bin #设置不要复制的数据库(可…

C++之虚函数

都说面向对象的三大特性是封装、继承、多态。C作为一门面向对象编程语言&#xff0c;肯定也是具备了面向对象的三大特性&#xff0c;那么在C中是如何实现多态的呢&#xff1f; 在C中是通过虚函数动态绑定的方式实现多态的。 虚函数与纯虚函数 首先我们来回顾一下虚函数&…

DAX:GROUPBY函数

DAX 中的 SUMMARIZE 函数功能强大&#xff0c;但同时也很难使用。 它可用于执行表之间的分组和连接&#xff0c;正如我们之前在分组数据一文中描述的那样。 不幸的是&#xff0c;它在计算聚合值时存在一些众所周知的性能问题。除了性能之外&#xff0c;SUMMARIZE 的计算限制是它…

ArrayList中的 subList 强转 ArrayList 导致异常

阿里《Java开发手册》上提过 [强制] ArrayList的sublist结果不可強转成ArrayList,否则会抛出ClassCastException异常&#xff0c;即java.util.RandomAccesSubList cannot be cast to java. util.ArrayList. 说明: subList 返回的是ArrayList 的内部类SubList, 并不是ArrayList …

一块RTX 3090加速训练YOLOv5s,时间减少11个小时,速度提升20%

作者&#xff5c;BBuf 很高兴为大家带来One-YOLOv5的最新进展&#xff0c;在《一个更快的YOLOv5问世&#xff0c;附送全面中文解析教程》发布后收到了很多算法工程师朋友的关注&#xff0c;十分感谢。 不过&#xff0c;可能你也在思考一个问题&#xff1a;虽然OneFlow的兼容性做…

SQL之substrate()函数用法

测试表字段查询如下&#xff1a; 测试在hive中截取前5位字符的第1种写法&#xff1a; 测试在hive中截取前5位字符的第2种写法&#xff1a; 测试在impala中截取前5位字符的第1种写法&#xff1a; 测试在impala中截取前5位字符的第2种写法&#xff1a; 结果&#xff1a; 1、在h…

带分数(蓝桥杯C/C++B组真题详解)

目录 题目 题目思路 题目代码 注解&#xff1a; 1.题目给定的判定条件为 2.关于next_permutation(start,end); 题目&#xff1a; 题目思路&#xff1a; 因为题目要求是满足在1到9中 不重复、不遗漏的所有满足条件的情况 所以我们可以通过全排列 把整数、分子、分母 …

B-树(B-Tree)与二叉搜索树(BST):讲讲数据库和文件系统背后的原理(读写比较大块数据的存储系统数据结构与算法原理)...

人类总喜欢发明创造一些新名词&#xff08;比如说&#xff0c;简写/缩写/简称什么的&#xff09;&#xff0c;并通过这些名词把人群分成了三六九等。弄到最后&#xff0c;把自己都绕晕了。你看&#xff0c;首先就是&#xff0c;B树&#xff0c;不要与Binary tree或Btree混淆。B…

有奖征文 | 当我们谈操作系统时,我们在谈什么?

OS&#xff0c;Operating System&#xff0c;操作系统&#xff0c;计算机中最基本也是最重要的基础性系统软件。1991 年&#xff0c;大二学生 Linus Torvalds 写出 Linux0.01&#xff0c;经过几十年的发展&#xff0c;以 Linux 为代表的服务器操作系统&#xff0c;成长为一个既…

lambda之Stream流式编程

lambda之Stream流式编程 一、什么是 Stream Stream中文称为 “流”&#xff0c;通过将集合转换为这么一种叫做“流”的元素序列&#xff0c;通过声明性方式&#xff0c;能够对集合中的每个元素进行一系列并行或串行的流水线操作。换句话说&#xff0c;你只需要告诉流你的要求…

led护眼台灯对眼睛好?过来人说说led护眼灯是否真的能护眼

众所周知&#xff0c;现在绝大部分光源都是使用led发光&#xff0c;无论是室内照明灯、室外装饰灯、气氛调节灯、工作学习护眼台灯等等&#xff0c;都是使用led灯珠&#xff0c;那么也就有人会问了&#xff1a;led灯真的对眼睛好吗&#xff1f;Led护眼台灯真的能护眼吗&#xf…

TH7-搜附近

TH7-搜附近说明1、探花1.1、查询推荐列表dubbo服务1.1.1、实体对象1.1.2、定义接口1.1.3、编写实现1.1.4、单元测试1.2、查询推荐列表APP接口实现1.2.1、TanHuaController1.2.2、TanHuaService1.2.3、测试1.3、喜欢的dubbo服务1.3.1、定义接口1.3.2、编写实现1.4、左滑右滑1.4.…

fofa搜索漏洞技巧

fofa搜索漏洞技巧整理,主要有以下十个方面:搜索HTTP响应头中含有"thinkphp"关键词的网站和IP;加上标题带有后台的;加上时间,现在新网站有thinkphp日志泄露的有很多; 搜索html正文中含有"管理后台"关键词的网站和IP body="管理后台"等。 …

Linux内核缓存

【推荐阅读】 轻松学会linux下查看内存频率,内核函数,cpu频率 纯干货&#xff0c;linux内存管理——内存管理架构&#xff08;建议收藏&#xff09; 一篇长文叙述Linux内核虚拟地址空间的基本概括 页缓存和块缓存 内核为块设备提供了两种通用的缓存方案&#xff1a; 页缓存&a…

光华股份深交所上市:市值51亿 应收账款余额超5亿

雷递网 雷建平 12月8日浙江光华科技股份有限公司&#xff08;简称&#xff1a;“光华股份”&#xff0c;证券代码&#xff1a;001333&#xff09;今日在深交所主板上市。光华股份本次发行3200万股&#xff0c;发行价为27.76元&#xff0c;募资8.88亿元。光华股份开盘价为33.31元…

开源,是不道德的!

原创&#xff1a;小姐姐味道&#xff08;微信公众号ID&#xff1a;xjjdog&#xff09;&#xff0c;欢迎分享&#xff0c;非公众号转载保留此声明。请删掉你的github开源代码&#xff0c;让CV工程师成为真正的工程师。不要做真正的代码分享&#xff0c;因为除了满足一下你的虚荣…