我如何使用安全的strcpy_s函数?

时间:2014-06-09 13:28:57

标签: c++ c

我正在尝试使用更安全的strcpy更新对strcpy_s的来电。旧函数调用如下所示:

char buf[6];
strcpy(buf+1, "%#c");

为了将上面的代码转换为更安全的版本,我会为size参数添加什么?

char buf[6];
strcpy_s(buf+1, /*SIZE GOES HERE*/, "%#c");

我想我对代码的buf+1部分感到困惑。这基本上只是一个指针指向来自buf的寄存器ONE块的指针吗?如果是这样,我会为strcpy_s的SIZE参数添加什么?我试过了:

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

这似乎有效,但我想知道是否有更好的方法来做到这一点。

3 个答案:

答案 0 :(得分:5)

如果您要复制buf开始,请说:

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

由于您正在跳过第一个字符,因此您可以使用一个更少的字符,因此:

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

答案 1 :(得分: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");

按字母大小划分是多余的,但要记住这一点很好,因为如果你使用宽字符就必须这样做。

答案 2 :(得分:0)

buf+1指向一个超出buf起始地址的内存位置,因此副本从该位置开始有效。但size参数指定目标大小。将sizeof(buf+1)用于该参数没有意义。您应该传递目的地的可用空间(应该是< =(总大小 - 起始偏移量))。

在你的情况下,它应该是

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

look here for details