主要作用:
strcpy_s()
是 C++ 中的一个安全版本的字符串拷贝函数,主要用于将源字符串(包括终止字符 '\0')复制到目标字符串中。这个函数属于 C11 和 C++11 标准库的一部分,并提供了一个额外的参数来指定目标缓冲区的大小,从而增加了安全性,避免了缓冲区溢出的问题。
函数原型:
errno_t strcpy_s(char* dest, rsize_t destsz, const char* src);
参数
dest
:指向目标字符数组的指针,该数组将存储从src
拷贝的字符串。destsz
:目标字符数组的大小(以字节为单位)。这个参数允许strcpy_s()
检查是否会发生缓冲区溢出。src
:要拷贝的源字符串。返回值
如果函数成功执行,
strcpy_s()
将返回0
。如果出现错误,例如目标缓冲区太小,它将返回一个非零的错误代码。
示例代码 :
#include <cstring>
#include <iostream>
int main() {
char dest[50];
const char* src = "Hello, World!";
if (strcpy_s(dest, sizeof(dest), src) == 0) {
std::cout << "字符串拷贝成功: " << dest << std::endl;
} else {
std::cout << "字符串拷贝失败" << std::endl;
}
return 0;
}
在这个示例中,我们尝试将
src
字符串拷贝到dest
数组中。我们使用sizeof(dest)
来确保destsz
参数是正确的,这样strcpy_s()
就可以检查是否有足够的空间来存储源字符串,从而避免缓冲区溢出。注意事项
- 确保目标缓冲区有足够的空间来存储源字符串,包括终止字符 '\0'。
strcpy_s()
在拷贝完成后会自动在目标字符串的末尾添加终止字符 '\0'。- 与
strcpy()
不同,strcpy_s()
不会自动截断超出目标缓冲区大小的源字符串。如果源字符串(包括终止字符)的长度大于或等于目标缓冲区的大小,strcpy_s()
将返回一个错误。- 在一些编译器和操作系统中,
strcpy_s()
可能不可用。在这种情况下,你可以使用strncpy()
函数作为替代方案,但请注意strncpy()
不会自动添加终止字符,因此你可能需要手动添加。
实际意义:
在我的文章,C++ primer plus题目及解析的十二章中第12.1题就运用到了这个知识点,
主要要注意的是两个指针类型不可直接相互赋值,必须为其中一个申请空间,在使用strcpy_s()才能够安全的赋值。建议大家可以去翻看一下。