C strcpy() 函数

C strcpy() 语法

strcpy() 是 C 语言 <string.h> 标准库的一个函数,它用于将一个字符串复制到另一个字符串中去,然后返回一个指向目标字符串的指针。

语法:

strcpy(dest, src)

说明:

strcpy() 函数接收以下 2 个参数。

  • dest(char*):目标字符串的指针。
  • src(const char*):源字符串的指针。

strcpy(dest, src) 会将 src(包括其终止符 '\0')中的所有字符复制到 dest 指向的内存位置。复制过程会从 src 的第一个字符开始,直到遇到 src 的终止符 '\0',并将该终止符也复制到 dest 中。

提示: strcpy 是 “string copy” 的缩写。

C strcpy() 摘要

使用频率 高(但需谨慎使用)
修改字符串
官方文档 查看

C strcpy() 示例

接下来,我们通过几个简单的例子来讲解一下 C strcpy() 函数是如何使用的。

示例 1:strcpy() 基本用法

#include <stdio.h>
#include <string.h>

int main(void)
{
    char str1[] = "Python";
    char str2[] = "Go";
    strcpy(str1, str2);

    puts(str1);
    puts(str2);
    printf("%zu\n", strlen(str1));
    printf("%zu", strlen(str2));

    return 0;
}

运行结果如下。

Go
Go
2
2

分析:

从结果可以看出,strcpy() 函数会将新的内容直接替换原来的内容。在实际开发中,strcpy() 函数大多用于 “备份” 一个字符串,以避免该字符串被修改,请看下面例子。

示例 2:使用 strcpy() + strcat()

#include <stdio.h>
#include <string.h>

int main(void)
{
    char str1[] = "Go";
    char str2[] = "Python";
    char result[50];

    // 复制 str1 到 result
    strcpy(result, str1);
    // 拼接 str2 到 result 末尾
    strcat(result, str2);

    // 打印结果
    puts(str1);
    puts(str2);
    puts(result);

    return 0;
}

运行结果如下。

Go
Python
GoPython

分析:

strcat() 会修改原字符串。如果你不希望原字符串被修改,可以先使用 strcpy() 函数将原字符串复制一份,然后再使用 strcat() 函数进行拼接。

strcpy() 的注意事项

strcpy() 函数的一个主要缺点在于:它不会执行任何长度检查。strcpy() 会假定目标缓冲区 dest 足够大,足以容纳源字符串 src 的全部内容(包括终止符 '\0')。

如果源字符串的长度大于目标缓冲区的大小,strcpy() 会发生缓冲区溢出。这会导致程序行为异常,可能覆盖相邻的内存区域,引发崩溃甚至带来安全漏洞。

为了更安全地进行字符串复制,我们推荐使用以下替代方案:

  • strncpy() 函数:它可以指定最多复制多少个字符。但需要注意的是,如果源字符串的长度大于指定的复制数量 n,strncpy() 不会在目标字符串的末尾自动添加终止符 '\0',而需要我们手动添加。
  • strcpy_s() 函数:(C11 标准引入的可选函数)这是一个更安全的版本,它要求指定目标缓冲区的大小,并在发生溢出时提供错误处理机制。不过,并不是所有 C 环境都支持 strcpy_s() 函数。

在实际项目开发中,除非我们能绝对确定 “目标缓冲区的大小” 总是大于等于 “源字符串的长度加 1(用于终止符)” ,否则应优先考虑使用 strncpy() 并确保手动添加终止符,而尽量避免使用 strcpy()。

上一篇: strncmp()

下一篇: strncpy()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号