当前位置: 首页 > news >正文

(C语言篇)处理字符串的四个基础函数

strlenstrcpystrcatstrcmp使用以及注意事项

在C语言中,strlenstrcpystrcatstrcmp是处理字符串的四个基础函数,都在<string.h>头文件中声明。下面为你详细介绍它们的功能、用法和注意事项。

1. strlen - 计算字符串长度

函数原型

size_t strlen(const char *s);

功能:计算字符串s的有效长度(不包含终止符'\0')。
示例

#include <stdio.h>
#include <string.h>int main() {char str[] = "Hello";printf("长度: %zu\n", strlen(str));  // 输出: 5printf("sizeof: %zu\n", sizeof(str)); // 输出: 6(包含'\0')return 0;
}

注意点

  • 字符串必须以'\0'结尾,否则会导致越界访问。
  • 返回值类型是size_t(无符号整数),进行减法运算时要特别注意溢出问题。

2. strcpy - 复制字符串

函数原型

char *strcpy(char *dest, const char *src);

功能:把src字符串(包含'\0')复制到dest
示例

#include <stdio.h>
#include <string.h>int main() {char src[] = "Hello";char dest[10];strcpy(dest, src);printf("复制结果: %s\n", dest);  // 输出: Helloreturn 0;
}

注意点

  • dest必须有足够的空间,否则会引发缓冲区溢出。
  • 会覆盖dest原有的内容。
  • 建议使用更安全的strncpy,但要手动添加'\0'
    strncpy(dest, src, sizeof(dest) - 1);
    dest[sizeof(dest) - 1] = '\0';  // 确保以'\0'结尾
    

3. strcat - 连接字符串

函数原型

char *strcat(char *dest, const char *src);

功能:将src字符串(包含'\0')追加到dest的末尾。
示例

#include <stdio.h>
#include <string.h>int main() {char dest[20] = "Hello";char src[] = " World";strcat(dest, src);printf("连接结果: %s\n", dest);  // 输出: Hello Worldreturn 0;
}

注意点

  • dest必须有足够的空间容纳src,否则会导致缓冲区溢出。
  • dest必须是一个已经以'\0'结尾的字符串。
  • 建议使用更安全的strncat
    strncat(dest, src, sizeof(dest) - strlen(dest) - 1);
    

4. strcmp - 比较字符串

函数原型

int strcmp(const char *s1, const char *s2);

功能:按字典序比较s1s2,返回值规则如下:

  • s1 < s2,返回负数(通常是-1,但标准未明确规定具体值)。
  • s1 == s2,返回0。
  • s1 > s2,返回正数(通常是1,但标准未明确规定具体值)。
    示例
#include <stdio.h>
#include <string.h>int main() {char s1[] = "apple";char s2[] = "banana";if (strcmp(s1, s2) < 0) {printf("%s 在 %s 之前\n", s1, s2);  // 输出: apple 在 banana 之前}return 0;
}

注意点

  • 比较的是字符的ASCII值(或当前字符集的编码值)。
  • 常用于字符串排序或判断字符串是否相等(返回0表示相等)。
  • 大小写会影响比较结果,例如"Apple""apple"是不同的。

安全替代函数

为避免缓冲区溢出,建议优先使用以下更安全的函数:

原函数安全替代函数区别
strcpystrncpy需要手动添加'\0'
strcatstrncat自动追加'\0',但需指定最大追加长度
-snprintf可替代strcpystrcat,更安全

总结

函数功能返回值关键风险
strlen(s)计算字符串s的长度size_t类型的长度值字符串未以'\0'结尾会导致越界
strcpy(dest, src)复制srcdestdest的指针可能引发缓冲区溢出
strcat(dest, src)src追加到dest末尾dest的指针可能引发缓冲区溢出
strcmp(s1, s2)比较s1s2整数(<0、0、>0)-

手动实现:

#include <stddef.h>  // 提供size_t类型定义/* 计算字符串长度(不包含终止符'\0') */
size_t strlen(const char *s) {const char *p = s;while (*p != '\0') {  // 遍历直到遇到字符串结束符p++;}return p - s;  // 指针相减得到字符数量
}/* 复制字符串src到dest(包含终止符'\0') */
char *strcpy(char *dest, const char *src) {char *original_dest = dest;  // 保存原始指针用于返回while ((*dest++ = *src++) != '\0');  // 复制每个字符直到遇到'\0'return original_dest;  // 返回目标字符串起始地址
}/* 将字符串src追加到dest末尾(覆盖dest的终止符) */
char *strcat(char *dest, const char *src) {char *original_dest = dest;// 定位到dest的终止符位置while (*dest != '\0') {dest++;}// 从dest的终止符位置开始复制srcwhile ((*dest++ = *src++) != '\0');return original_dest;  // 返回目标字符串起始地址
}/* 按字典序比较两个字符串 */
int strcmp(const char *s1, const char *s2) {while (*s1 == *s2) {  // 比较相同位置的字符if (*s1 == '\0') {  // 如果同时到达终止符,说明字符串相等return 0;}s1++;s2++;}// 返回第一个不相等字符的差值(ASCII码差值)return (unsigned char)*s1 - (unsigned char)*s2;
}
  1. strlen
    • 使用指针遍历字符串,直到遇到 '\0'
    • 通过指针减法计算字符数量
    • 返回类型为 size_t(无符号整数)
  2. strcpy
    • 使用后置递增运算符同时移动指针和赋值
    • 循环条件包含赋值操作,自动处理终止符 '\0'
    • 返回原始目标指针以便链式调用
  3. strcat
    • 先定位到 dest 的终止符位置
    • 从终止符位置开始复制 src 内容(包含终止符)
    • 不检查 dest 空间是否足够,需调用者确保
  4. strcmp
    • 逐字符比较直到发现差异或结束
    • 返回值为第一个不相等字符的差值
    • 使用 unsigned char 转换避免符号扩展导致的比较错误

相关文章:

  • 一发入魂:极简解决 SwiftUI 复杂视图未能正确刷新的问题(下)
  • Navicat连接开启sm3认证的瀚高数据库
  • 关于摄像头模块的红外截止滤光片
  • C++-演讲比赛项目
  • 【机器人】复现 3D-Mem 具身探索和推理 | 3D场景记忆 CVPR 2025
  • 深度解析3D模型生成器:基于StyleGAN3与PyTorch3D的多风格生成工具开发实战
  • 【Web渗透】DVWA搭建详细教程
  • 用Python构建学生成绩管理系统的基本方案
  • leetcode hot100:解题思路大全
  • Web安全基础
  • 网络I/O学习-poll(三)
  • 异步记录用户操作日志
  • LLM笔记(九)KV缓存(2)
  • 智谱清言微服务架构转型实践——基于 CloudWeGo 的技术演进
  • 软件设计师“UML”真题考点分析——求三连
  • Triton介绍和各平台支持情况分析
  • 电路研究9.3.6——合宙Air780EP中的AT开发指南:FTP 应用指南
  • EMC风险评估详解
  • DApp开发全流程解析:模式设计、功能参考与合约管理实践
  • 【IDEA】删除/替换文件中所有包含某个字符串的行
  • 花旗回应减员传闻:持续评估人力资源战略,将为受影响的个人提供支持
  • 抖音开展“AI起号”专项治理,整治利用AI生成低俗猎奇视频等
  • 音著协宣布胜诉,虎牙公司终审被判侵权
  • 南宁海关辟谣网传“查获600公斤稀土材料”:实为焊锡膏
  • 《习近平新时代中国特色社会主义思想学习论丛》第十一辑至第十五辑出版发行
  • “马上涨价”再到“吞下关税”,美政策让沃尔玛“输两次”