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 变量与其比较避免溢出导致逻辑错误。