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

5分钟搞定阿里云千问大模型API申请:手把手教你获取API Key 本文提供了一份高效的阿里云通义千问大模型API Key获取实战指南。通过清晰的步骤,帮助开发者在五分钟内完成从账号准备、精准导航控制台到创建并验证API Key的全过程,并强调了密钥安全管理和基础调用测试的重要性,助力快速集成AI能力。 阅读详情


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


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个字节
  • 返回值如下:
    在这里插入图片描述

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

全网最详细 解决戴维南定理的详细推导 替代定理,戴维南定理详细证明 阅读详情

相关推荐

零基础学习大气污染模式(WRF、WRF-chem、smoke、camx等)

零基础学习大气污染模式(WRF、WRF-chem、smoke、camx等)

weixin_56135535的博客 654

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

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

2403_87581574的博客 1351

LDPC码介绍:基础&编码&译码

本博客介绍了LDPC码的基本原理,其中包括校验矩阵的构造、Tanner 图和编译码的基础知识。

渺小的颗星的博客 4309

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

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

怀秋秋意的博客 646

荣耀Magic 6 dToF LiDAR Android阵营全球第一首发

40X30分辨率的BSI SPAD小面阵,帧率达到60帧,搭配多传感器融合算法, 可产生足够的稠密点云,为应用设备提供可靠的距离传感。在手机消费电子方案中,dToF LiDAR技术不仅提升了手机的功能和用户体验,还为手机厂商提供了差异化的竞争优势。随着技术的不断进步和市场的快速发展,我们可以期待未来dToF LiDAR技术将在手机领域发挥更大的作用,为用户带来更多创新和便捷的功能。增强现实(AR)体验:通过dToF LiDAR提供的高精度深度信息,手机可以更准确地放置虚拟物体在现实世界的表面上。

致力于lidar应用开发 19万+

Swin Transformer 类可视化(grad CAM)

完整代码 from pytorch_grad_cam import GradCAM, ScoreCAM, GradCAMPlusPlus, AblationCAM, XGradCAM, EigenCAM from pytorch_grad_cam.utils.image import show_cam_on_image from torchvision.models import resnet50 import glob from demo import parse_option from models i

G果的博客 6639

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

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

2401_86956109的博客 1401

基于Simulink的无迹卡尔曼滤波(UKF)SOC高精度估计仿真

本文介绍了基于Simulink的无迹卡尔曼滤波(UKF)在电池SOC高精度估计中的应用。通过无迹变换替代传统EKF的线性化过程,UKF显著提升了SOC估计精度,在强非线性工况下误差可控制在0.5%以内。文章详细阐述了UKF的核心原理,包括Sigma点生成、状态预测和观测更新等关键步骤,并基于Thevenin等效电路模型构建了完整的UKF SOC估算系统。通过Simulink建模和仿真验证,展示了UKF在大电流脉冲、变温工况等复杂场景下的优异性能,其动态响应时间小于30ms,长期累积误差低于0.7%。研究为储

amy_mhd的博客 124

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

文章目录前言一、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

Altera FPGA与高速ADS4249和DAC3482的LVDS接口设计

引言:本文以TI的ADS4249(ADC)和DAC3482(DAC)之间的接口为例,介绍Altera FPGA与ADC/DAC之间的DDR LVDS接口设计以及时序约束详细设计。本文介绍的实例可方便扩展到具有类似接口格式的其他高速数据转换器设计。

FPGA_Designer 1902

《Zephyr OS 入门与实战》第1章:Zephyr OS 架构与物联网定位

【代码】《Zephyr OS 入门与实战》第1章:Zephyr OS 架构与物联网定位。

2301_79143213的博客 1270

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

模拟实现 strchr 函数:

2302_81249757的博客 1450

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

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

chuxinweihui的博客 801

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

Pursue quality, not quantity. 2302

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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万+

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

C语言 —— 让无人传颂的歌谣 再度启唱 - 字符函数与字符串函数

下一个标记,并将其用 \0 结尾。

hedhjd的博客 1306
上一篇: 自定义类型:结构体进阶学习分享
下一篇: 内存泄漏是什么?有什么危害
小白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、付费专栏及课程。

余额充值