Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用安全strcpy_s功能?_C++_C - Fatal编程技术网

C++ 如何使用安全strcpy_s功能?

C++ 如何使用安全strcpy_s功能?,c++,c,C++,C,我正在尝试用更安全的strcpy\u更新对strcpy的调用。旧函数调用如下所示: char buf[6]; strcpy(buf+1, "%#c"); 为了将上述代码转换为更安全的版本,我应该为size参数输入什么 char buf[6]; strcpy_s(buf+1, /*SIZE GOES HERE*/, "%#c"); 我想我对代码的buf+1部分感到困惑。这本质上只是一个指针,指向buf上一个块的寄存器吗?如果是这样,我会为strcpy_s的SIZE参数输入什么?我试过: s

我正在尝试用更安全的
strcpy\u
更新对
strcpy
的调用。旧函数调用如下所示:

char buf[6];
strcpy(buf+1, "%#c");
为了将上述代码转换为更安全的版本,我应该为size参数输入什么

char buf[6];
strcpy_s(buf+1, /*SIZE GOES HERE*/, "%#c");
我想我对代码的
buf+1
部分感到困惑。这本质上只是一个指针,指向
buf
上一个块的寄存器吗?如果是这样,我会为strcpy_s的SIZE参数输入什么?我试过:

  strcpy_s(buf+1, sizeof(buf+1), "%#c");

这似乎有效,但我想知道是否有更好的方法

buf+1
指向超过
buf
起始地址1的内存位置,因此副本实际上从该位置开始。但是
size
参数指定了目标的大小。对该参数使用
sizeof(buf+1)
是没有意义的。您应该将目标的可用空间(应该是
buf+1
指向内存位置,超过
buf
的起始地址一个,这样副本就可以从该位置开始。但是
size
参数指定目标的大小。使用
sizeof(buf+1)没有意义
用于该参数。您应该传递目标的可用空间(应该大小应该
5
(假设您想跳过第一个索引)。正确的计算方法是:

int offset = 1; // not necessary, but shows the connection between the size and offset
strcpy_s(buf+offset, (sizeof(buf)-offset) / sizeof(buf[0]), "%#c");

按字符大小除法是多余的,但最好记住,因为如果使用较宽的字符,这是必要的。

大小应为
5
(假设要跳过第一个索引)。正确的计算方法是:

int offset = 1; // not necessary, but shows the connection between the size and offset
strcpy_s(buf+offset, (sizeof(buf)-offset) / sizeof(buf[0]), "%#c");

按字符大小进行除法是多余的,但最好记住,因为如果使用较宽的字符,这是必要的。

如果要复制到
buf
的开头,您会说:

strcpy_s(buf, sizeof(buf), "%#c");
由于跳过了第一个字符,因此可以使用的字符减少了一个,因此:

strcpy_s(buf + 1, sizeof(buf) - 1, "%#c");

如果您要复制到
buf
的开头,您会说:

strcpy_s(buf, sizeof(buf), "%#c");
由于跳过了第一个字符,因此可以使用的字符减少了一个,因此:

strcpy_s(buf + 1, sizeof(buf) - 1, "%#c");

您不能指向寄存器。您不能指向寄存器。+1:您应该使用对象本身:
…sizeof buf/sizeof*buf…
-1用于使用
sizeof(buf[0])
字符
buf
(请记住:
sizeof(char)
为1)不缩放就减去偏移量。这太奇怪了。@unwind,我已经修复了缩放。如果代码更改为使用宽字符,那么不缩放就会失败。这会使代码更加僵硬。我认为这是一个品味问题。@user207933你不能使用
strcpy\u()
对于宽字符,您必须使用,因为宽字符具有0字节的风险很大,这当然会愚弄
strcpy_s()
使其认为它具有字符串的命中端。+1:您应该使用对象本身:
…sizeof buf/sizeof*buf…
-1来使用
sizeof(buf[0])
带有字符
buf
(请记住:
sizeof(char)
为1)不缩放就减去偏移量。这太奇怪了。@unwind,我已经修复了缩放。如果代码更改为使用宽字符,那么不缩放就会失败。这会使代码更加僵硬。我认为这是一个品味问题。@user207933你不能使用
strcpy\u()
对于宽字符,您必须使用,因为宽字符有0字节的巨大风险,这当然会愚弄
strcpy_s()
使其认为它具有字符串的命中端。
strcpy_s()
想要的是目标的大小,而不是要复制的元素的数量。两个截然不同的东西。
strcpy_s()
想要的是目的地的大小,而不是要复制的元素数量。这是两种截然不同的东西。