【问题标题】:C++ - Using strcpy_s(s+2,s+3); doesn't work - "function does not take 2 arguments"C++ - 使用 strcpy_s(s+2,s+3);不起作用 - “函数不接受 2 个参数”
【发布时间】:2018-05-03 17:55:11
【问题描述】:

我刚刚开始了解 char 及其功能,我正在尝试像这样复制它。

我班上的老师给我们举了这个例子:

对于 s = "carte",strcpy(s+2, s+3) => s="cate"。显然我想尝试一下,但我收到了这个错误:

"严重性代码描述项目文件行抑制状态 错误 C2660 'strcpy_s':函数不接受 2 个参数 "

提示? 谢谢。

【问题讨论】:

  • 您的示例显示了strcpy 的使用,而错误消息说您正在使用strcpy_s,那么您使用的是哪一个,真的吗?请提供minimal reproducible example
  • 你的老师给了你一个不好的例子,应该被枪毙。这是您告诉他/她的内容:内存源和目标重叠,并且他/她假设 strcpy 将使用 memmove (它可以安全地进行复制),因为这不是现实生活中发生的情况。编辑:@AlgirdasPreidžius 在错误中发现了对strcpy_s 的引用!如果老师使用它,那么会有一个大小参数:即使这样 如果源字符串和目标字符串重叠,strcpy_s 的行为是未定义的
  • 如果目标和源重叠,则不能使用strcpy
  • @AhmedMasud 他并没有像我上面所说的那样对 strcpy_s 说什么。 “我尝试使用 strcpy,但我从 Visual Studio 收到错误,我在阅读应该使用它后将其更改为 strcpy_s。”他只谈到了strcpy,但我不能使用它。 (见上文)
  • @KillzoneKid 如果您正在写入的部分缓冲区与您正在读取的部分缓冲区共享,则这是重叠。

标签: c++


【解决方案1】:

strcpy_s 接受 3 个参数。请注意“安全”的 _s 后缀。确保提供正确大小的目标缓冲区,以使其在此函数检查缓冲区溢出时工作(因此是“安全”后缀)。

供参考:这是 cppreference 上函数的 specification

【讨论】:

  • 它实际上也适用于 strcpy_s(s, t)。 (没有第三个)
  • @f0rta 只有当s是一个实际的数组而不是一个指针时,它的大小才能通过模板推导出来
猜你喜欢
  • 1970-01-01
  • 2022-11-08
  • 1970-01-01
  • 2018-11-29
  • 2018-09-08
  • 2013-11-18
  • 1970-01-01
  • 2021-01-20
  • 2017-04-05
相关资源
最近更新 更多