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);

📌 竞赛避坑清单

  1. strlen 依赖 \0;mem 系列函数不依赖结束符
  2. strcpy / strcat 不检查空间,大数据容易 RE,优先 strncpy / strncat
  3. strncpy 拷贝满 n 字节时不会自动补 \0,记得手动 dest[n] = '\0';
  4. memset 按字节填充,int 数组不能 memset 成 0x7fffffff
  5. char 数组比较内容不能直接用 ==,使用 strcmp
  6. strstr 暴力匹配,长字符串匹配卡常换 KMP

📌 函数选型速查表

表格

需求 推荐函数
获取字符串有效长度 strlen
安全复制字符串 strncpy + 手动补 '\0'
安全拼接字符串 strncat
字典序比较 strcmp / strncmp
查找子串 strstr(短串)
查找最后一个字符 strrchr
数组初始化清零 memset
整块内存拷贝 memcpy / memmove
字符大小写转换 tolower / toupper
字符串数字互转 sscanf / sprintf
posted @ 2026-09-27 10:02  似鬼年华  阅读(4)  评论(0)    收藏  举报