【C++字符串】<cstring>头文件
专栏网址https://blog.csdn.net/zhujushu/category_13112687.html0.概述C 风格字符串是以 \0结尾的字符数组表示字符串的结束。cstring 库继承自 C 语言是 C 标准库的一部分用于操作 C 风格字符。C 风格字符串与 C 字符串对象 (std::string) 不同因为它们是低级的并且依赖于原始内存操作。cstring 库提供了各种用于操作 C 风格字符串的函数例如复制、连接、比较和搜索。这些函数将 C 风格字符串视为字符数组并在到达 null 终止符之前执行操作。本文将介绍 cstring 库提供的一些常用复制函数及它们的用法。1.头文件使用cstring 库里的复制函数要先包含头文件#include cstring2.cstring 头文件的函数2.1 复制函数复制函数用于操作和复制 C 风格字符串或内存块。每个函数都有其自己的用途具体取决于是否使用以 null 结尾的字符串或原始内存块。常用的 C cstring 复制函数如下所示以及它们的描述。1memcpy将一个缓冲区复制到另一个缓冲区。2memmove更安全的将一个缓冲区移动到另一个缓冲区。3strcpy用于将一个字符串复制到另一个字符串。4strncpy用于将一个字符串中一定数量的字符复制到另一个字符串。2.1.1 memcpyC 库函数 memcpy() 从一个存储区复制指定数量个字节到另一个存储区。在下面的示例中我们将一个字符串复制到另一个字符串。const char b[50] Hello World!; char a[50]; memcpy(a, b, strlen(b)1); //strlen()求一个字符串的长度字符数 printf(%s\n, a);输出Hello World!2.1.2 memmoveC 库函数memmove() 在重叠内存块这方面比 memcpy() 更安全。如果目标区域和源区域有重叠的话memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中复制后源区域的内容会被更改。如果目标区域与源区域没有重叠则和 memcpy() 函数功能相同。看下面的示例char a[20] old; const char b[] new; printf(1.\na : %s\nb : %s\n\n\n, a, b); memmove(a, b, strlen(b)1); //strlen()函数求一个字符串的长度字符数 printf(2.\na : %s\nb : %s\n, a, b);输出1.a : oldb : new2.a : newb : new2.1.3 strcpyC 库函数 strcpy() 把字符串复制到目标数组返回一个指向最终目标数组的指针。注意如果目标数组不够大而源字符串的长度又太长可能会造成缓冲溢出的情况。看下面的示例char a[40]; char b[] Hello World!; strcpy(a, b); printf(%s\n, a);输出Hello World!2.1.4 strncpyC 库函数 strncpy() 把字符串复制到目标数组且需指定最多复制的字符数量。当源字符串的长度小于最多复制的字符数量时剩余部分将用空字节填充。因其有数量限制和自动填充功能所以常被用作strcpy()函数的代替方案。看下面的示例char a[15]; char b[40]; memset(b, \0, sizeof(b)); strcpy(a, Hello World!); strncpy(b, a, 12); printf(%s\n, b);输出Hello World!2.1.5 关键注意事项安全性strcpy易引发溢出优先使用strncpy或检查目标缓冲区大小。性能memcpy效率最高但不适用于重叠内存。终止符所有函数均依赖\0判断字符串结束需确保正确处理。2.2 连接函数连接函数用于连接 C 风格字符串或内存块。每个函数都有其自己的用途具体取决于是否使用以 null 结尾的字符串或原始内存块。常用的 C cstring 连接函数如下所示以及它们的描述。1strcat用于连接两个字符串。2strncat用于连接两个字符串中指定数量的字符。2.2.1 strcatC 库函数 strcat() 用于连接两个 C 风格字符串。在下面的示例中我们将两个 C 风格字符串连接并输出。char a[50] Hello ; char b[] World!; strcat(a, b); printf(%s\n, a);输出Hello World!2.2.2 strncatC 库函数 strncat() 用于连接两个 C 风格字符串中指定数量的字符。看下面的示例char a[30] Hello ; const char *b World!; strncat(a, b, 10); printf(%s\n, a);此示例展示了用 strncat() 将一个字符串的一部分追加到另一个字符串的结尾。注意须确保目标字符数组足够大以容纳结果字符串和结尾的空字符。注意事项目标字符串 a 需要有足够的空间来容纳要拷贝的字符串。strncat() 将a字符串最后的\0覆盖掉在字符追加完成后再追加 \0 。如果参数n大于源字符串src的长度则只会复制整个src字符串到dest的末尾如果n小于src的长度则只会复制前n个字符。无论哪种情况都会在新字符串的末尾添加空字符。与strcat的区别strcat() 函数把源字符串整个连接到目标字符串的后面而 strncat() 则可以指定连接源字符串前指定数量个字符。使用 strncat()可以避免陷入死循环的可能并且能够自由控制要增加的字符个数。2.3 其他函数除了复制和连接函数C库还提供了用于比较、搜索和计算字符串长度的函数。这些函数同样是操作 C 风格字符串的基础工具。常用的 C 库其他函数以及它们的描述如下。1strlen计算字符串的长度不包括终止空字符。2strcmp比较两个字符串。3strncmp比较两个字符串的前 n 个字符。4strchr在字符串中查找第一次出现指定字符的位置。5strstr在字符串中查找第一次出现指定子字符串的位置。2.3.1 strlenC 库函数 strlen() 用于计算字符串的长度即从字符串开头到终止空字符\0之前的字符数。看下面的示例#include cstring #include cstdio int main() { const char* str Hello, CSDN!; size_t len strlen(str); printf(字符串 \%s\ 的长度是 %zu。\n, str, len); return 0; }输出字符串 Hello, CSDN! 的长度是 12。2.3.2 strcmpC 库函数 strcmp() 用于比较两个字符串。它按字典顺序逐个字符比较直到遇到不同的字符或遇到终止空字符为止。返回值若 str1 小于 str2返回负值。若 str1 等于 str2返回 0。若 str1 大于 str2返回正值。看下面的示例#include cstring #include cstdio int main() { const char* str1 apple; const char* str2 banana; int result strcmp(str1, str2); if (result 0) { printf(\%s\ 小于 \%s\\n, str1, str2); } else if (result 0) { printf(\%s\ 大于 \%s\\n, str1, str2); } else { printf(\%s\ 等于 \%s\\n, str1, str2); } return 0; }输出apple 小于 banana2.3.3 strncmpC 库函数 strncmp() 用于比较两个字符串的前 n 个字符。与 strcmp() 类似但只比较指定数量的字符。看下面的示例#include cstring #include cstdio int main() { const char* str1 abcdef; const char* str2 abcxyz; int result strncmp(str1, str2, 3); // 比较前3个字符 if (result 0) { printf(前3个字符相同。\n); } else { printf(前3个字符不同。\n); } return 0; }输出前3个字符相同。2.3.4 strchrC 库函数 strchr() 在字符串中查找第一次出现指定字符的位置并返回指向该位置的指针。如果未找到则返回空指针NULL。看下面的示例#include cstring #include cstdio int main() { const char* str Hello, World!; char ch W; const char* result strchr(str, ch); if (result ! NULL) { printf(字符 %c 在字符串中第一次出现的位置是%ld\n, ch, result - str); } else { printf(未找到字符 %c\n, ch); } return 0; }输出字符 W 在字符串中第一次出现的位置是72.3.5 strstrC 库函数 strstr() 在字符串中查找第一次出现指定子字符串的位置并返回指向该位置的指针。如果未找到则返回空指针NULL。看下面的示例#include cstring #include cstdio int main() { const char* str C programming is fun!; const char* substr programming; const char* result strstr(str, substr); if (result ! NULL) { printf(子字符串 \%s\ 在字符串中第一次出现的位置是%ld\n, substr, result - str); } else { printf(未找到子字符串 \%s\\n, substr); } return 0; }输出子字符串 programming 在字符串中第一次出现的位置是4关键注意事项安全性strcmp和strncmp不会修改字符串内容相对安全。性能strlen需要遍历整个字符串直到遇到 \0时间复杂度为 O(n)。空指针检查使用strchr和strstr前应确保字符串不为空使用后应检查返回值是否为 NULL。终止符检查重要使用的 C 风格字符串应确保以 \0 结尾否则函数可能会越界访问内存导致未定义行为、程序崩溃或安全漏洞。3.总结通过合理选择函数可以高效、安全地在 C中 操作 C 风格字符串。温馨提示请留下点赞

相关新闻

ASMR下载终极指南:一键获取asmr.one海量音频资源

ASMR下载终极指南:一键获取asmr.one海量音频资源

ASMR下载终极指南:一键获取asmr.one海量音频资源 还在为寻找高品质ASMR音频而烦恼吗?asmr-downloader是一款专为ASMR爱好者设计的智能下载工具,能够从asmr.one平台轻松获取海量音频资源,支持MP3、WAV、FLAC等多种格式&#xff0c…

2026/7/22 23:08:01 阅读更多 →
基于DM642 DSP的实时MPEG-2编码系统设计与RF-5框架集成实践

基于DM642 DSP的实时MPEG-2编码系统设计与RF-5框架集成实践

1. 项目概述:在DM642 EVM上实现实时MPEG-2编码如果你在2000年代初期接触过数字视频处理或者嵌入式多媒体开发,那么对德州仪器(TI)的TMS320DM642这款DSP芯片一定不会陌生。它曾经是很多视频监控、视频会议和机顶盒方案的核心&#…

2026/7/22 23:08:01 阅读更多 →
【高速缓存】RedisVL使用 SemanticRouter 进行智能查询路由指南

【高速缓存】RedisVL使用 SemanticRouter 进行智能查询路由指南

引言 在构建复杂的 AI 应用时,我们常常需要根据用户查询的主题或意图,将请求分发到不同的处理模块。例如,一个客服机器人可能需要将技术问题转给技术专家、将账单问题转给财务系统、将投诉转给投诉处理部门。传统做法是使用关键词匹配或规则分…

2026/7/22 23:08:01 阅读更多 →

最新新闻

XUnity Auto Translator:让外语游戏秒变中文的智能翻译神器

XUnity Auto Translator:让外语游戏秒变中文的智能翻译神器

XUnity Auto Translator:让外语游戏秒变中文的智能翻译神器 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为看不懂的外语游戏而烦恼吗?想第一时间体验国外热门游戏却苦于语言…

2026/7/22 23:52:19 阅读更多 →
如何为DrivenByMoss贡献代码:参与开源项目的完整指南

如何为DrivenByMoss贡献代码:参与开源项目的完整指南

如何为DrivenByMoss贡献代码:参与开源项目的完整指南 【免费下载链接】DrivenByMoss Bitwig Studio extensions for many controllers: Ableton Push I/II, Akai APC40mkI/mkII/mini, Fire, Arturia Beatstep, Novation Launchpads / Remote SLs, NI Maschine / Kom…

2026/7/22 23:52:19 阅读更多 →
XUnity Auto Translator:10分钟掌握游戏实时翻译的终极指南

XUnity Auto Translator:10分钟掌握游戏实时翻译的终极指南

XUnity Auto Translator:10分钟掌握游戏实时翻译的终极指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾经因为语言障碍而错过了精彩的日系游戏?是否面对韩文或俄文游戏…

2026/7/22 23:52:19 阅读更多 →
2026千问无门槛优惠券激活码(亲测可用)

2026千问无门槛优惠券激活码(亲测可用)

最近发现一个能给我省钱,一番研究后发现了一个激活入口。现整理给大家。这个就是千问官方推出的一个特定专属活动,只给新用户提供的福利。你可以在APP内输入指定口令:千问新用户专属878554,即可领取8元无门槛立减券。这个口令实测…

2026/7/22 23:52:19 阅读更多 →
Threagile服务器模式深度探索:Web界面与REST API实战应用

Threagile服务器模式深度探索:Web界面与REST API实战应用

Threagile服务器模式深度探索:Web界面与REST API实战应用 【免费下载链接】threagile Agile Threat Modeling Toolkit 项目地址: https://gitcode.com/gh_mirrors/th/threagile Threagile作为一款敏捷威胁建模工具包(Agile Threat Modeling Toolk…

2026/7/22 23:51:19 阅读更多 →
请认准磨针C盘清理官网,百度搜索磨针工具软件

请认准磨针C盘清理官网,百度搜索磨针工具软件

磨针c盘清理官网随着电脑使用时间越来越长,很多用户都会遇到一个常见问题:C盘空间越来越小,电脑运行速度变慢,甚至出现系统卡顿、软件无法安装等情况。很多人尝试手动删除文件,但又担心误删系统文件;使用一…

2026/7/22 23:51:19 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统,尤其是像TI C6000系列这样的高性能DSP开发中,我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动,但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案? 在数字化协作环境中,消息通知系统的重要性不言而喻明。但现实情况是,企业级通知方案往往需要复杂的API对接(如企业微信、钉钉、飞书),个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点",乙方听到的是"少做几页"。甲方说"不要太复杂",乙方理解成"别放图表了"。结果交过去,甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里,是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻