obsidian/笔记文件/2.笔记/C++ strcpy_s的详细用法.md
2025-03-26 00:02:56 +08:00

53 lines
2.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#qt
## 主要作用:
strcpy_s() 是 C++ 中的一个安全版本的字符串拷贝函数,主要用于将源字符串(包括终止字符 '\0')复制到目标字符串中。这个函数属于 C11 和 C++11 标准库的一部分,并提供了一个额外的参数来指定目标缓冲区的大小,从而增加了安全性,避免了缓冲区溢出的问题。
##  函数原型:
``` cpp
errno_t strcpy_s(char* dest, rsize_t destsz, const char* src);
```
参数
dest指向目标字符数组的指针该数组将存储从 src 拷贝的字符串。
destsz目标字符数组的大小以字节为单位。这个参数允许 strcpy_s() 检查是否会发生缓冲区溢出。
src要拷贝的源字符串。
返回值
如果函数成功执行strcpy_s() 将返回 0。如果出现错误例如目标缓冲区太小它将返回一个非零的错误代码。
## 示例代码
``` cpp
#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()才能够安全的赋值。建议大家可以去翻看一下。
```