C++ - 使用 strcpy_s(s+2,s+3);不起作用 - “函数不接受 2 个参数”

Posted

技术标签:

【中文标题】C++ - 使用 strcpy_s(s+2,s+3);不起作用 - “函数不接受 2 个参数”【英文标题】:C++ - Using strcpy_s(s+2,s+3); doesn't work - "function does not take 2 arguments" 【发布时间】: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 如果您正在写入的部分缓冲区与您正在读取的部分缓冲区共享,则这是重叠。 【参考方案1】:

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

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

【讨论】:

它实际上也适用于 strcpy_s(s, t)。 (没有第三个) @f0rta 只有当s是一个实际的数组而不是一个指针时,它的大小才能通过模板推导出来

以上是关于C++ - 使用 strcpy_s(s+2,s+3);不起作用 - “函数不接受 2 个参数”的主要内容,如果未能解决你的问题,请参考以下文章

strcpy_s 缓冲区 L 缓冲区太小 && 0

VS2013 C++中的strcpy用不了,说换成strcpy_s,还是出现错误了。

c++如何用指针指向二维数组

C++ & OpenCV 断言失败

C++Q

c++字符串截取 编写函数如substr(sting s ,int n) 要求取字符串S 的第N个字符 如 substr(k123,3) 结果为2