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()。
