C++字符数组常用函数
一、基础字符串函数(cstring)
1. strlen 获取有效长度
size_t strlen(const char *s);
- 返回不含
\0的字符个数 sizeof获取数组总大小,不要和strlen混淆
char s[100] = "abc";
strlen(s); // 3
sizeof(s); // 100
2. strcpy 字符串拷贝(不安全)
char* strcpy(char *dest, const char *src);
复制 src 到 dest,连带末尾 \0;不检查空间,容易越界 RE,竞赛慎用
3. strncpy 限定长度拷贝(推荐)
char* strncpy(char *dest, const char *src, size_t n);
最多拷贝 n 个字符;
⚠️ 坑:如果 src 长度 >= n,不会自动追加 '\0',需要手动补:
dest[n] = '\0';
4. strcat 字符串拼接(不安全)
char* strcat(char *dest, const char *src);
从 dest 的 \0 处追加 src,自带 \0;不检查空间,容易越界
5. strncat 限定长度拼接(推荐)
char* strncat(char *dest, const char *src, size_t n);
最多追加 n 个字符,自动补 '\0'
6. strcmp 字典序比较
int strcmp(const char *s1, const char *s2);
- 返回
0:s1 == s2 - 返回
<0:s1 字典序更小 - 返回
>0:s1 字典序更大
❌ 禁止
if(s1 == s2),比较的是地址,不是字符串内容
7. strncmp 比较前 n 个字符
int strncmp(const char *s1, const char *s2, size_t n);
只对比前 n 位,用于前缀匹配
二、查找类函数
8. strchr 正向查找字符
char* strchr(const char *s, int c);
找到第一个 c,返回指针;找不到返回 NULL
9. strrchr 反向查找字符(最后一个)
char* strrchr(const char *s, int c);
找到字符串最后一次出现的 c,常用于找后缀小数点
10. strstr 查找子串
char* strstr(const char *haystack, const char *needle);
在 haystack 找子串 needle,返回子串首地址;找不到返回 NULL
⚠️ 暴力算法,大数据会卡时间,此时手写 KMP
11. strspn /strcspn 字符集合匹配
size_t strspn(const char *s, const char *accept);
从开头连续统计属于 accept 集合的字符数量
size_t strcspn(const char *s, const char *reject);
统计到第一次出现 reject 内字符为止的长度,常用于分割字符串
三、mem 内存系列函数(不依赖 '\0',数组通用)
12. memset 按字节填充(竞赛高频)
void* memset(void *ptr, int value, size_t num);
⚠️ 按单个字节填充!
- char 数组清零:
memset(s, 0, sizeof(s)); - char 数组设为 0x3f:
memset(s, 0x3f, sizeof(s)); - int 数组只能 memset 0 /-1
13. memcpy 内存拷贝
void* memcpy(void *dest, const void *src, size_t n);
拷贝 n 字节;不能处理内存重叠
14. memmove 安全内存拷贝(支持重叠)
void* memmove(void *dest, const void *src, size_t n);
数组内部移动字符使用
15. memcmp 内存逐字节比较
int memcmp(const void *s1, const void *s2, size_t n);
比较前 n 字节,不识别 \0,固定长度数组对比
四、cctype 字符判断函数(单个 char)
#include <cctype>
isalpha(c)是否字母isdigit(c)是否数字islower(c)是否小写字母isupper(c)是否大写字母tolower(c)转小写toupper(c)转大写
五、cstdio 字符串与数字互转
16. sprintf 数字转 char []
char s[100];
int x = 123;
sprintf(s, "%d", x);
安全版本:snprintf(s, sizeof(s), "%d", x);
17. sscanf char [] 转数字
char s[] = "456";
int x;
sscanf(s, "%d", &x);
📌 竞赛避坑清单
strlen依赖\0;mem 系列函数不依赖结束符strcpy/strcat不检查空间,大数据容易 RE,优先strncpy/strncatstrncpy拷贝满 n 字节时不会自动补\0,记得手动dest[n] = '\0';memset按字节填充,int 数组不能 memset 成 0x7fffffff- char 数组比较内容不能直接用 ==,使用 strcmp
- strstr 暴力匹配,长字符串匹配卡常换 KMP
📌 函数选型速查表
表格
| 需求 | 推荐函数 |
|---|---|
| 获取字符串有效长度 | strlen |
| 安全复制字符串 | strncpy + 手动补 '\0' |
| 安全拼接字符串 | strncat |
| 字典序比较 | strcmp / strncmp |
| 查找子串 | strstr(短串) |
| 查找最后一个字符 | strrchr |
| 数组初始化清零 | memset |
| 整块内存拷贝 | memcpy / memmove |
| 字符大小写转换 | tolower / toupper |
| 字符串数字互转 | sscanf / sprintf |
天助自助者

浙公网安备 33010602011771号