字符函数和字符串函数解析及模拟实现

Starlink vs Kuiper vs OneWeb:三大低轨卫星网络架构对比与实战应用场景解析 本文对比分析了Starlink、Kuiper和OneWeb三大低轨卫星网络架构的技术差异与商业应用场景。从轨道设计、通信性能到商业落地,详细解析了各系统在近地卫星网络领域的独特优势与挑战,为未来全球宽带服务格局提供专业见解。 阅读详情


在这里插入图片描述
在这里插入图片描述


1. 求字符串长的函数

1.1strlen

size_t strlen ( const char * str );
  • 字符串以’\0’作为结束标志,strlen函数返回的是在字符串中’\0’前面出现过的字符个数(不包括’\0’)。
  • 参数指向的字符串必须以’\0’结束。
  • 注意函数的返回值位size_t, 是无符号的。

1.2 strlen()模拟实现

//模拟实现的strlen()函数命名位my_strlen()函数
//模拟实现方法一
//size_t my_strlen(const char* str)
//{
//	assert(str);
//	int count = 0;
//	while (*str != '\0')
//	{
//		count++;
//		str++;
//	}
//	return count;
//}

//模拟实现方法二:指针-指针
//size_t my_strlen(const char* str)
//{
//	assert(str);
//	char* start = str;
//	while (*str)
//	{
//		str++;
//	}
//	return str - start;
//}

//模拟实现方法三:递归
size_t my_strlen(const char* str)
{
	assert(str);
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);
}

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

2.1strcpy

 char * strcpy ( char * destination, const char * source );
  • Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point).
  • 源字符串必须以’\0’结束
  • 会将源字符串中的’\0’拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。

2.1.2 模拟实现

//模拟实现的strcpy()函数命名位my_strcpy()函数
char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

2.2 strcat

char * strcat ( char * destination, const char * source );
  • Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the first character of source, and a null-character is included at the end of the new string formed by the concatenation of both in destination.
  • 源字符串必须以’\0’结束。
  • 会将源字符串中的’\0’拷贝到目标空间。
  • 目标空间必须足够大,能容纳下源字符串中的内容。
  • 目标空间必须可修改。

2.2.1 模拟实现

char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	//1.找到目标空间'\0'
	while (*dest)
	{
		dest++;
	}
	//2. 追加字符
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

2.3 strcmp

 int strcmp ( const char * str1, const char * str2 );
  • This function starts comparing the first character of each string. If they are equal to each other, it continues with the following pairs until the characters differ or until a terminating null-character is reached.
  • 标准规定:
    。第一个字符串大于第二个字符串,则返回大于0的数字。
    。第一个字符串等于第二个字符串,则返回0。
    。第一个字符串小于第二个字符串,则返回小于0的数字。

2.3.1 模拟实现

//模拟实现的strcmp()函数命名位my_strcmp()函数
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		str1++;
		str2++;
	}
	return *str1 - *str2;
}



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

3.1 strncpy

 char * strncpy ( char * destination, const char * source, size_t num );
  • Copies the first num characters of source to destination. If the end of the source C string (which is signaled by a null-character) is found before num characters have been copied, destination is padded with zeros until a total of num characters have been written to it.
  • 拷贝num个字符从源字符串到目标空间。
  • 如果源字符串的长度小于num,则拷贝完源字符串后,在目标的后面追加0,知道num个。

3.2 strncat

 char * strncat ( char * destination, const char * source, size_t num );
  • Appends the first num characters of source to destination, plus a terminating null-character.
  • If the length of the C string in source is less than num, only the content up to the terminating null-character is copied.

3.3 strncmp

int strncmp ( const char * str1, const char * str2, size_t num );
  • 比较到出现两个字符不同或者一个字符串结束或者num个字符全部比较完。
    在这里插入图片描述

4. 字符串查找

4.1 strstr

 const char * strstr ( const char * str1, const char * str2 );    
  • Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1.

4.1.2模拟实现

//模拟实现的strstr()函数命名位my_strstr()函数
// str2在str1中的位置,空字符不参与其中
const char* strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	if (str2 == '\0') return NULL;
	const char* cp = str1, * s1 = str1, * s2 = str2;
	while (cp)
	{
		if (*cp == *str2)
		{
			s1 = cp, s2 = str2;
			while (*s1 && *s2 && (*s1 == *s2))
			{
				s1++, s2++;
			}
			if (*s2 == '\0') return cp;
		}
		cp++;
	}
	return NULL;
}


4.2 strtok

char * strtok ( char * str, const char * sep );
  • sep参数是一个字符串,定义了用作分隔符的字符集合。
  • 第一个参数指定了一个字符串,它包含了0个或多个由sep字符串中一个或多个分隔符分割标记。
  • strtok函数找到str中的下一个标记,并将其用’\0’结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般是临时拷贝的内容并且可以修改)
  • strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为NULL,函数将在同一个字符串中被保留的位置开始,查找下一个标记。
  • 如果字符串中不存在更多的标记,则返回NULL。

4.2.1 如何使用

int main()
{
	char arr1[] = "zhenyuWang@yeah.net";
	char copy[30];
	strcpy(copy, arr1);

	char arr2[] = "@.";
	char* ret = NULL;
	for (ret = strtok(copy, arr2); ret != NULL; ret = strtok(NULL, arr2))
	{
		printf("%s\n", ret);
	}
	return 0;
}

5. 错误信息报告

库函数在执行时候,发生错误会将一个错误码存放在errno这个变量中。而errno是C语言提供的一个全局变量。

5.1 strerror

char * strerror ( int errnum );
  • 返回错误码所对应的信息。

5.1.1 如何使用

#include <stdio.h>
#include <string.h>
int main()
{
	for (int i = 0; i < 10; i++)
	{
		printf("%d: %s\n", i,strerror(i));
	}
	return 0;
}

运行结果:
在这里插入图片描述
字符分类函数:
在这里插入图片描述
字符转换:

int tolower (int c)
int toupper (int c)


6. 内存操作函数

6.1 memcpy

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

6.1.1 模拟实现

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

6.2 memmove

void * memmove ( void * destination, const void * source, size_t num );
  • 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可重叠的。
  • 如果源空间和目标空间出现重叠,就得使用memmove函数处理。

6.2.1 模拟实现

void* my_memmove(void* dest, const void* src, size_t num)
{
	assert(dest && src);
	void* ret = dest;
	if (dest > src)//从后向前拷贝
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	else//从前向后拷贝
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	return ret;
}

6.3 memcmp

int memcmp ( const void * ptr1, const void * ptr2, size_t num );
  • 比较从prt1和prt2指针开始的num个字节
  • 返回值如下:
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

深度探索:机器学习中的Label Propagation算法(基于图论的半监督学习方法)原理及其应用 Label Propagation算法作为一种基于图论的半监督学习方法,有效地利用了数据的内在结构和未标注样本信息,降低了对标注数据的依赖。尽管存在对初始标签敏感、易陷入局部最优等局限性,但在图像分类、社交网络分析、生物信息学等领域展现了良好的应用前景。未来的研究方向可能包括:探索更稳健的标签初始化策略、设计抗噪声和异常值的相似度计算方法、结合深度学习模型提升模型表示能力等。随着半监督学习理论和技术的不断发展,Label Propagation及其变种算法将在更大范围内推动机器学习在标注数据有限情况下的应用 阅读详情

相关推荐

Cesium+Three.js融合实战:从零构建GIS与BIM一体化大场景

本文详细介绍了Cesium与Three.js融合技术在GIS与BIM一体化大场景中的应用实践。通过坐标系转换、双引擎协同渲染等核心技术,实现宏观地理信息与微观建筑细节的完美结合,为智慧城市、数字孪生等项目提供高效解决方案。文章包含环境配置、性能优化等实战经验,助力开发者快速掌握三维可视化开发技巧。

weixin_42563415的博客 262

C语言字符函数和字符串函数全解析:从使用到模拟实现

本文介绍了C语言标准库中的字符和字符串处理函数,包括字符分类函数(如isalpha、isdigit等)、字符转换函数(如tolower、toupper)以及字符串操作函数(strlen、strcpy、strcat、strcmp、strncpy等)。通过讲解函数用法、注意事项和模拟实现,帮助读者深入理解其底层逻辑。文章提供了丰富的代码示例,如字符转换案例、strlen的无符号陷阱、字符串拷贝的实现等,使读者能够掌握这些核心函数的正确使用方法和实现原理。

2403_87581574的博客 1351

手搓ZLMediaKit实现拉流推流系列3(RK3588上YOLO系列拉流、MPP解码+编码、推流全流程)

 前段时间比较忙,一直没有时间补充后续的内容。今天终于抽出空来,立马进入码字环节:手搓ZLMediaKit实现拉流推流系列在本篇也终于迎来了完结篇,在本篇文章中,你将看到以下一整套完整流程:使用ZLMediaKit拉流---MPP解码---Yolo模型进行推理---MPP编码并推流。

m0_46303486的博客 2174

C语言—字符函数和字符串函数解析及其模拟实现

重点介绍处理字符和字符串的库函数的使用和注意事项以及模拟实现

怀秋秋意的博客 646

【软件测试】人工智能(AI)在软件测试领域的应用

AI在软件测试领域的应用使测试过程更加自动化、高效和智能。它可以帮助测试团队减轻负担,更快地识别和修复问题,最终提高软件的质量和可靠性。随着AI技术的不断进步,未来AI在软件测试领域的应用将更加广泛和深入。

weixin_46453070的博客 4385

使用 Python 构建 Reddit 热帖爬虫:抓取热门讨论帖和评论

在现代互联网中,Reddit 被誉为全球最大、最活跃的讨论平台之一,汇聚了各种主题的帖子、评论和社交互动。因此,抓取 Reddit 上的热门帖子和评论可以为我们提供一个丰富的文本数据源,可以用于情感分析、话题建模、趋势分析等应用。Reddit 提供了官方的 API,可以让开发者获取包括帖子、评论、用户信息等在内的各种数据。我们可以结合上述方法,抓取多个热门帖子,并将每个帖子的标题、作者、发布时间和评论内容保存到一个数据结构中。每个帖子的对象包含了丰富的信息,如标题、内容、发布时间、作者等。

2201_76125261的博客 382

字符函数和字符串函数(上)

上面的代码,我们将小写转大写,是-32完成的效果,有了转换函数,就可以直接使用 tolower 函数。我们可以看到返回1,=返回0,但是在其他的编译器可能就不是这么返回的了,可能

2401_86956109的博客 1401

电脑技巧:Hyper-V安装UOS操作系统图文教程

今天给大家分享微软官方Hyper-v虚拟机管理软件安装UOS操作系统图文教程,感兴趣的朋友也可以下载试一试,当然有啥问题也可以互相沟通交流!

IT技术分享社区 4707

字符串函数和内存操作函数详解及模拟实现

文章目录前言一、strlen二、strcmp三、strcpy四、strcat五、strncmp六、strncpy七、strncat八、strstr九、strtok十、strerror十一、memcpy十二、memmove十三、memset十四、memcmp总结 前言 本篇对字符串和内存操作函数进行介绍并对其进行模拟实现。内容涵盖:strlen 、strcmp、strcpy、strcat、strncmp、strncpy、strncat、strstr、strtok、strerror、memcpy、memst.

weixin_52016782的博客 508

39、信号流图:解决线性代数方程组的图论方法

本文介绍了信号流图理论在求解线性代数方程组中的应用,重点阐述了Coates方法和Mason方法的原理、步骤及对比分析。通过图论视角,将矩阵运算转化为对有向图结构的分析,利用1-因子、1-阶连接、前向路径和反馈回路等概念,推导出方程组解的拓扑公式。文章结合具体实例演示两种方法的计算过程,并总结其在电路分析、控制系统和通信系统等领域的拓展应用,展示了信号流图理论的直观性与有效性。

pear55的博客 88

【异常】飞书OpenClaw机器人 HTTP 401: Invalid Authentication 报错排查与解决方案

HTTP 401 是HTTP协议标准定义的未授权(Unauthorized)状态码,核心含义为请求方身份认证无效,服务端拒绝执行本次请求。飞书开放平台服务端对自建机器人的全链路鉴权校验失败。无论是机器人接收飞书事件推送的上行请求,还是机器人主动调用飞书开放平台API的下行请求,只要身份凭证无效、鉴权逻辑校验不通过,飞书服务端就会返回该报错,并最终透传到飞书客户端会话窗口中。

奶爸的编程之路,也就一周冷个三天 3761

解析spritf和sscanf与模拟常用字符串函数strchr,strtok(二)

模拟实现 strchr 函数:

2302_81249757的博客 1450

全覆盖路径规划开源项目Clean-robot-turtlebot3关键函数解析(上)

本系列文章主要介绍全覆盖路径规划开源项目Clean-robot-turtlebot3的相关内容,包含如下四篇文章,分别介绍了开源项目Clean-robot-turtlebot3流程的概括总结、ROS坐标系常用坐标及其变换、Clean-robot-turtlebot3关键函数解析等内容。

慕羽★的博客 2778

字符函数和字符串函数详解

本章讲述的是字符函数和字符串函数的相关内容,我们会一步一步认识到字符分类函数与转换函数的应用,以及strlen,strcpy,strcat,strcmp等与字符串函数的相关内容。

chuxinweihui的博客 801

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【C语言】字符串函数+内存函数的总结与剖析

知识点总结篇:string库函数📝

Pursue quality, not quantity. 2302

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

strcat函数解析

一、认识strcat strcat函数又被称为是字符串追加/连接函数,它的功能就是在一个字符串后面追加上另外一个字符串。 使用方式如下: #include<string.h> #include<stdio.h> int main() { char arr1[20] = "hello "; char arr2[] = "world"; strcat(arr1, arr2); printf("%s\n", arr1); return 0; } 库函数中strcat函数的声明是

codezhu的博客 8万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C语言函数:字符串函数及模拟实现strncpy()、strncat()、strncmp()

​ C语言函数:字符串函数及模拟实现strncpy() 在了解strncpy前,需要先了解strcpy(): C语言函数:字符串函数及模拟实现strlen() 、strcpy()、 strcat()_srhqwe的博客-优快云博客 strncpy(): 作用:拷贝受限制长度的字符串,意思是:可以指定拷贝字符的个数到目标字符串内。 限制字符串个数是为了让程序相对安全,降低访问越界等情况出现的可能性。但是不会绝对安全,一个程序员要写bug如挥手一般

srhqwe的博客 2717

【c语言】模拟实现字符串函数(上)

关关难过关关过 前路漫漫亦灿烂 今天 阿紫 就带领大家一起挑战字符串函数的模拟实现

拼命阿紫冲冲冲! 3825

C语言字符函数和字符串函数详解

本篇文章分享了C语言的字符函数和字符串函数的使用方法以及如何通过自己的程序来模拟实现这些函数,包括大小写的转换,strlen,strcpy,strcat,strcmp,strncpy,strncat,strncmp,strstr,strtok,strerror等,详细地讲述了字符函数和字符串函数,对于刚学习C语言的小伙伴来说非常友好。

Anmory的博客 8236

strtok函数的使用说明和模拟实现,strerror函数、字符分类函数、字符转换函数的介绍

字符串函数收尾阶段,快快进来,包你进步。

GD_small_bit的博客 457

【C进阶】——详解10个C语言中常见的字符串操作函数及其模拟实现

1.求字符串长度——strlen2.字符串拷贝——strcpy3.字符串追加函数——strcat4.字符串比较函数——strcmp5.小结6. strncpy7. strncat8. strncmp8.1演示练习9.字符串查找函数——strstr9.1使用及注意事项9.2strstr的模拟实现10. strtok10.1功能解释及使用说明10.2 代码演示及优化11. strerror

m0_70980326的博客 2855

C语言五大字符串函数解析(含模拟实现)

返回字符串长度(不含'\0');- 遇到停止- 空字符串返回0- 未终止字符串导致未定义行为:将src复制到dest(含- 高危操作:必须确保dest空间足够- src必须以'\0'结尾- 返回dest指针(链式调用):将src追加到dest末尾;- dest必须已包含有效字符串- 高危操作:需确保剩余空间足够- 覆盖原dest的'\0'模拟实现::按字典序比较字符串;- 返回值:<0(s1<s2),0(相等),>0(s1>s2)

2501_92097222的博客 358

深入理解《字符串》及其函数——C语言

C语言字符串 字符串函数 📌strlen 函数模拟 📌strcpy 函数模拟 📌strcat 函数模拟 📌strcmp 函数模拟 📌strncpy 📌strncat 📌strstr 函数模拟 📌strtok 📌streeor 📌字符分类函数 内存函数 📌memcpy 函数模拟实现 📌memmove

一些七零八碎的知识点 3669

字符函数和字符串函数

求字符串长度:strlen 字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。 参数指向的字符串必须要以 '\0' 结束。 注意函数的返回值为size_t,是无符号的( 易错 ) 学会strlen函数的模拟实现 函数的使用: 上面两个不同的区别是前一个有‘\0’,strlen函数是去寻找‘\0’,第二个求出来是随机值。 strlen函数的模拟实现: 下面采用的是计数器的方法。 给出来一个错误示..

qq_41629803的博客 497

C语言从入门到精通——进阶5 字符串函数和内存函数

字符函数和字符串函数 C语言本身没有字符串类型,字符串通常放在常量字符串中或字符数组中 strlen 数到\0停止,但不包含\0 返回值是size_t,是无符号的 typedef unsigned int size_t; //模拟实现strlen int my_strlen(const char* str) { int count = 0; assert(str != NULL); while(*str != '\0') { count++; str++..

m0_58125693的博客 841

详细介绍关于字符函数和字符串函数【C语言】

这边文章能够帮助你快速学会c语言中的字符函数和内存操作函数

qq_2972806103的博客 1655
上一篇: 自定义类型:结构体进阶学习分享
下一篇: 内存泄漏是什么?有什么危害
小白debug~
小白debug~ 新星创作者: C/C++技术领域 新星创作者: C/C++技术领域
博客等级 码龄4年 3510粉丝 128原创
评论 75
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白debug~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值