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()
想要的是目的地的大小,而不是要复制的元素数量。这是两种截然不同的东西。