C语言strcpy与strcat函数详解:原型、实现与安全用法

周予安
周予安
发布时间:2026-10-14| 5人浏览过
原创

在C语言编程中,strcpy用于复制字符串,strcat用于拼接字符串。两者均要求包含头文件 <string.h>(C++中为 <cstring>)。核心要点在于:dest 必须有足够空间容纳源字符串,且两函数执行后返回目的指针以支持链式调用。由于缺乏长度检查,它们极易引发缓冲区溢出,实际开发中应优先考虑安全版本。

strcpy 函数:字符串拷贝

第1步:理解原型与功能

strcpy 的全称为 string copy。其原型声明如下:

char *strcpy(char *dest, const char *src);
  • 功能:将 src 指向的字符串(包含结尾的 '\0')复制到 dest 开始的地址空间。
  • 返回值:返回指向 dest 的指针,便于链式操作。
  • 关键约束:src 和 dest 所指内存区域不可重叠;dest 必须预分配足够大的空间,否则会导致越界写入。

第2步:分析源码实现逻辑

以下是两种常见的 strcpy 实现方式,展示了底层指针移动的机制。

1. 典型的工业级最简实现:

char *strcpy(char *strDestination, const char *strSource) {
    assert(strDestination != NULL && strSource != NULL);
    char *strD = strDestination;
    while ((*strD++ = *strSource++) != '\0');
    return strDestination;
}

注:内层括号确保取赋值表达式的值(即左操作数 *strD),当复制到 '\0' 时循环停止,但 '\0' 已被写入。

2. GNU-C 中的紧凑实现:

char* strcpy(char *d, const char *s) {
    char *r = d;
    while((*d++=*s++));
    return r;
}

strcat 函数:字符串拼接

第1步:理解原型与功能

strcat 的全称为 string catenate(concatenation)。其原型声明如下:

char *strcat(char *dest, const char *src);
  • 功能:将 src 追加到 dest 末尾。首先找到 dest 的结尾 '\0',然后覆盖该位置开始写入 src 的内容,最后在新的末尾添加 '\0'。
  • 返回值:返回指向 dest 的指针。
  • 关键约束:同样要求 dest 有足够剩余空间容纳追加后的完整字符串;内存不可重叠。

第2步:分析源码实现逻辑

strcat 的实现分为两个阶段:定位目的地尾部和执行拷贝。

典型实现代码:

char *strcat(char *strDest, const char *strSrc) {
    char *address = strDest;
    assert((strDest != NULL) && (strSrc != NULL));
    
    // 第一阶段:移动指针直到遇到结束符 '\0'
    // 注意:不能直接在while中使用 ++,因为那样会跳过最后一个字符的判断或导致指针偏移错误
    while (*strDest) {
        strDest++;
    }
    
    // 第二阶段:从当前位置开始拷贝
    while (*strDest++ = *strSrc++);
    
    return address;
}

注意:在第二个 while 循环中,条件表达式完成赋值后自动递增,包括最后的 '\0' 也会被拷贝并触发终止,无需手动添加 *strDest='\0';。

安全风险与现代替代方案

尽管上述实现展示了经典算法,但在生产环境中直接使用 strcpy 和 strcat 存在巨大的安全隐患。主要风险是缓冲区溢出:如果 dest 的空间不足以容纳整个源字符串,程序将写入非法内存,导致崩溃或被攻击者利用。

在现代 C/C++ 开发中,建议采取以下措施:

  1. 使用安全版本:微软等厂商提供了扩展版本,如 strcpy_s 和 strcat_s,它们需要额外传入缓冲区大小参数。
    // 示例:strcpy_s(dest, dest_size, src);
  2. 手动检查长度:在使用原版函数前,务必计算 strlen(src) 并确认 dest 剩余空间充足。
  3. 考虑其他策略:对于频繁拼接场景,可考虑预分配足够大的缓冲区和手动管理偏移量,或使用 sprintf/snprintf 进行格式化输出。

以上就是C语言中strcpy与strcat函数的详细内容,更多关于字符串处理与安全编码的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。