C/C\+\+ 内存与字符串操作函数详解
C/C 内存与字符串操作函数详解一、C 语言标准库函数string.h/ C 中cstring所有函数均为字节级裸指针操作字符串默认以\0作为结束标志。1. 内存操作函数mem- 前缀 memory 内存这类函数不关心内存中的数据类型按字节数操作连续内存块。memcpymemory copy内存拷贝原型void *memcpy(void *dest, const void *src, size_t n);从 src 地址拷贝 n 个字节到 dest 地址。不处理内存重叠若源和目标区域重叠行为未定义重叠场景必须使用 memmove。memmovememory move内存移动原型void *memmove(void *dest, const void *src, size_t n);功能同 memcpy但支持内存区域重叠内部通过临时缓存保证拷贝正确性是实现字符串中间删除的核心函数。memsetmemory set内存填充原型void *memset(void *s, int c, size_t n);将 s 指向的前 n 个字节全部赋值为字符 c。常用于内存清零、字符串清空仅对 char 类型赋值任意值安全不可用于给 int、结构体等非字节类型赋值非 0 值。memcmpmemory compare内存比较原型int memcmp(const void *s1, const void *s2, size_t n);按字节逐位比较前 n 个字节返回值小于 0 表示 s1 更小等于 0 表示完全相同大于 0 表示 s1 更大。memchrmemory character内存字符查找原型void *memchr(const void *s, int c, size_t n);在前 n 个字节中查找字符 c 第一次出现的地址找到返回对应指针未找到返回 NULL。2. 字符串操作函数str- 前缀 string 字符串所有字符串函数都依赖结尾的\0判断边界操作前必须保证字符串合法结束。1拷贝与赋值strcpystring copy字符串拷贝原型char *strcpy(char *dest, const char *src);将 src 完整拷贝到 dest包含结尾的\0。不检查 dest 容量存在缓冲区溢出风险。strncpystring n copy受限长度字符串拷贝原型char *strncpy(char *dest, const char *src, size_t n);最多拷贝 n 个字符。注意若 src 长度 ≥ n拷贝后不会自动追加\0需手动补全若 src 更短剩余位置自动用\0填充。strdupstring duplicate字符串复制原型char *strdup(const char *s);内部调用 malloc 分配堆内存并拷贝字符串返回新字符串的首地址。使用后必须手动 free 释放否则会造成内存泄漏。2拼接追加strcatstring concatenate字符串拼接原型char *strcat(char *dest, const char *src);将 src 拼接到 dest 尾部覆盖原结尾的\0并保留新的结束符。同样存在缓冲区溢出风险。strncatstring n concatenate受限长度字符串拼接原型char *strncat(char *dest, const char *src, size_t n);最多拼接 n 个字符且会自动在末尾追加\0比 strcat 更安全。3字符串比较strcmpstring compare字符串比较原型int strcmp(const char *s1, const char *s2);按 ASCII 字典序逐字符比较返回值正负零分别表示 s1 小于、等于、大于 s2。strncmpstring n compare受限长度字符串比较原型int strncmp(const char *s1, const char *s2, size_t n);仅比较前 n 个字符超出长度的部分不参与比较。4查找与定位strchrstring character正向字符查找原型char *strchr(const char *s, int c);正向查找字符 c 在字符串中第一次出现的地址未找到返回 NULL。strrchrstring reverse character反向字符查找原型char *strrchr(const char *s, int c);反向查找字符 c 最后一次出现的地址r 代表 reverse反向。strstrstring string子串查找原型char *strstr(const char *haystack, const char *needle);在主串 haystack 中查找子串 needle 第一次出现的起始地址未找到返回 NULL。strspnstring span前缀匹配长度原型size_t strspn(const char *s, const char *accept);返回字符串 s 开头连续包含 accept 字符集的字符个数span 表示 “跨度、范围”。strcspnstring complement span前缀不匹配长度原型size_t strcspn(const char *s, const char *reject);返回字符串 s 开头连续不包含 reject 字符集的字符个数c 代表 complement补集。5长度与分割strlenstring length字符串长度原型size_t strlen(const char *s);返回字符串的字符个数不包含结尾的\0。strtokstring token字符串分割原型char *strtok(char *str, const char *delim);按分隔符 delim 分割字符串首次调用传原串后续传 NULL 继续分割。会修改原字符串且不可重入、线程不安全可重入版本为strtok_rstring token reentrant可重入字符串分割安全版本为strtok_sstring token safe安全字符串分割。6清空与删除核心补充C 标准库没有提供名为 strdelete 的专属删除函数字符串删除、清空均通过已有内存 / 字符串函数间接实现整串清空用strcpy(dest, )写入空字符串仅修改首字节为\0效率最高。用memset(dest, 0, len)将整片内存清零适合需要彻底清空数据的场景。删除指定位置的字符 / 子串核心使用memmove实现将删除位置后方的字符整体前移覆盖被删除的内容自动保留结尾的\0。示例删除字符串 s 中第 pos 位开始的 len 个字符memmove(spos,sposlen,strlen(sposlen)1);必须使用 memmove 而非 memcpy因为前移时源和目标内存区域重叠。二、C 内存与字符串操作C 完全兼容 C 语言的所有库函数同时提供了面向对象的字符串类和更安全的内存管理机制。1. 内存操作1原生内存管理操作符new / new[]分配堆内存 自动调用对象构造函数new 对应单个对象new [] 对应对象数组。delete / delete[]调用对象析构函数 释放堆内存必须与 new /new [] 配对使用不可混用。2标准库算法algorithm替代 C 语言的 mem 系列函数适用于非平凡对象有构造 / 析构函数的类对象保证类型安全std::copystandard copy区间拷贝将指定区间的元素拷贝到目标位置对应 C 语言的 memcpy但支持对象的拷贝构造。std::fillstandard fill区间填充将指定区间的所有元素赋值为指定值对应 C 语言的 memset但类型安全可用于任意类型。3底层内存工具memorystd::uninitialized_copy在未初始化的内存上构造并拷贝对象多用于容器底层实现日常开发较少直接使用。2. 字符串操作std::stringstringstd::string自动管理内存、动态扩容无需手动处理\0提供了完整的增删改查接口。1构造与赋值默认构造std::string s;生成空字符串C 串构造std::string s(hello);用 C 风格字符串初始化重复字符构造std::string s(5, a);生成 5 个 ‘a’ 的字符串拷贝构造std::string s2(s1);复制另一个字符串assign赋值成员函数支持按位置、长度截取赋值用法灵活。2拼接与追加运算符重载直接追加字符串、字符、C 风格字符串append追加成员函数支持多种重载可追加子串、重复字符等push_back尾部压入追加单个字符3长度与容量size() / length()返回字符串字符个数二者功能完全等价empty()判断字符串是否为空capacity()返回当前已分配的内存容量reserve()预分配内存容量减少扩容开销resize()调整字符串长度超出截断不足则填充指定字符4字符访问operator[]下标访问越界行为未定义性能更高at()下标访问越界时抛出std::out_of_range异常更安全front() / back()访问首尾字符C11c_str()返回以\0结尾的const char*指针用于兼容 C 语言接口5查找、修改与删除补充完整删除接口所有查找函数返回size_t类型的下标未找到时返回std::string::npos。查找类find()正向查找子串或字符第一次出现的位置rfind()反向查找子串或字符最后一次出现的位置find_first_of()查找字符集中任意字符第一次出现的位置find_last_of()查找字符集中任意字符最后一次出现的位置修改与删除类substrsub string截取子串返回指定位置、长度的子串不修改原字符串replace替换替换指定区间的内容为新字符串insert插入在指定位置插入字符或字符串erase擦除 / 删除专属删除函数支持三种重载删除指定位置开始的指定长度s.erase(pos, len);删除迭代器指向的单个字符s.erase(iter);删除迭代器区间内的所有字符s.erase(begin_iter, end_iter);pop_back尾部弹出删除最后一个字符C11clear清空删除所有字符将字符串置为空等价于s.erase()6C17 扩展std::string_view只读字符串视图不持有内存仅记录指针和长度用于高效传递字符串避免无意义的内存拷贝。关键注意事项安全优先C 语言的 strcpy、strcat 无边界检查生产环境优先使用带长度限制的 strncpy、strncat或直接使用 C 的 std::string。strncpy 陷阱源串长度 ≥ 限制长度时不会自动补\0必须手动设置结束符。重叠内存操作内存区域重叠时拷贝必须使用 memmove不能用 memcpy。指针失效std::string 调用 c_str () 返回的指针在字符串修改、扩容、析构后会立即失效不可继续使用。npos 类型std::string::npos 是无符号 size_t 类型不要用有符号 int 变量与其比较避免溢出导致逻辑错误。

相关新闻

2024三大AI编程助手横向评测:GPT-4o、Claude 3.5与Gemini 3

2024三大AI编程助手横向评测:GPT-4o、Claude 3.5与Gemini 3

1. 三大AI编程搭档横向评测 2024年成为AI编程助手的爆发年,三大主流平台相继推出重磅更新:Google的Gemini 3 Deep Think、Anthropic的Claude 3.5和OpenAI的GPT-4o。作为每天与代码打交道的开发者,我花了三周时间深度测试这三款工具在真实开发…

2026/7/29 14:03:02 阅读更多 →
08-ORA-00060死锁定位

08-ORA-00060死锁定位

ORA-00060:死锁——两个会话互相等对方那行 社保系统里两个人同时操作同一个参保人的数据是最常见场景。A在修改参保信息,B在改缴费记录——两个事务交叉等同一行,30秒后Oracle自动杀一个。这篇文章告诉你怎么查到是谁杀了谁、为什么。 文章目…

2026/7/29 13:54:16 阅读更多 →
极地遥感数据处理:DMSP卫星亮度温度数据实战解析

极地遥感数据处理:DMSP卫星亮度温度数据实战解析

1. 项目概述:极地遥感数据处理的工程实践 这个项目涉及国防气象卫星计划(DMSP)搭载的SSM/I和SSMIS传感器采集的极地亮度温度数据,经过网格化处理后形成的近实时数据集(版本V002)。作为从事遥感数据处理八年…

2026/7/29 13:58:41 阅读更多 →

最新新闻

SAP WM LB01创建TR的BAdI增强实现与优化

SAP WM LB01创建TR的BAdI增强实现与优化

1. SAP WM LB01创建TR增强的实现背景解析在SAP仓库管理(WM)模块中,LB01事务码用于创建传输请求(TR),这是系统间对象迁移的标准工具。实际业务中,企业往往需要根据自身仓储管理特点对标准TR创建流程进行定制化增强。这种需求通常源于以下几个典…

2026/7/29 14:32:40 阅读更多 →
电源管理芯片采购避坑:5个参数比价格更重要

电源管理芯片采购避坑:5个参数比价格更重要

电源管理芯片(PMIC)是电子系统里用量大、选型难的品类。选错一颗PMIC,轻则效率不达标,重则烧板。这篇从电源工程师视角拆解PMIC选型最容易踩的5个坑。 坑一:只看输入电压范围,忽略瞬态耐压。 很多工程师选…

2026/7/29 14:32:40 阅读更多 →
雷达CFAR恒虚警检测Matlab实现与优化技巧

雷达CFAR恒虚警检测Matlab实现与优化技巧

1. 雷达CFAR恒虚警检测Matlab程序解析 恒虚警检测(Constant False Alarm Rate, CFAR)是雷达信号处理中的核心技术,用于在复杂背景噪声中稳定检测目标。这个Matlab程序实现了典型CFAR算法,包含单元平均(CA-CFAR&#xf…

2026/7/29 14:32:40 阅读更多 →
166、安防低照度与宽动态:星光级sensor与多帧融合的工程实践

166、安防低照度与宽动态:星光级sensor与多帧融合的工程实践

166、安防低照度与宽动态:星光级sensor与多帧融合的工程实践 去年夏天,我在一个园区监控项目现场蹲了三天。甲方反馈夜间画面全是噪点,车牌根本看不清,而白天逆光场景下人脸一片死黑。项目经理拿着海康的竞品样机怼在我面前:“人家这个效果,你们怎么搞不出来?”我盯着示…

2026/7/29 14:32:40 阅读更多 →
御盾app加固实战拆解:移动应用破解及防护策略典型案例

御盾app加固实战拆解:移动应用破解及防护策略典型案例

实战拆解:移动应用破解及防护策略典型案例 移动应用“被破解”很少是一个单独的动作。更常见的情况是,攻击者先从安装包、网络请求、运行时行为或发布渠道中找到一个可利用的薄弱点,再把它和账号、自动化、重打包、篡改或服务端逻辑缺陷组合…

2026/7/29 14:32:39 阅读更多 →
3D打印喷头风扇魔改指南:从风量风压到风道设计的全面优化

3D打印喷头风扇魔改指南:从风量风压到风道设计的全面优化

1. 从“热床”到“热端”:为什么喷头风扇是3D打印的命门 玩3D打印的朋友,聊得最多的往往是热床调平、挤出机校准,或者各种神奇的耗材。但在我折腾了十几台机器,从入门级到工业级都摸过一遍之后,发现一个被严重低估的部…

2026/7/29 14:31:39 阅读更多 →

日新闻

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:00:23 阅读更多 →
AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 在上一期「AI编程系列」中,我们学习了如何构建一个基础的 AI 问答系统,通过简单的输入输出让模型回应问题。但现实世界中的 AI 应用往往需要处理更复杂的场景:…

2026/7/29 0:00:23 阅读更多 →
AI智能体开发实战:从工具调用到企业级部署

AI智能体开发实战:从工具调用到企业级部署

1. 从被动问答到主动执行:AI Agent的范式转变过去两年,大语言模型最显著的应用形态是聊天机器人——用户提问,AI回答。但真正的生产力革命发生在2023年下半年:当AI学会主动调用工具完成任务时,生产力工具的历史被彻底改…

2026/7/29 0:00:23 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻