【问题标题】:Visual Studio error: 'strcpy_s': too few arguments for callVisual Studio 错误:“strcpy_s”:调用的参数太少
【发布时间】:2021-02-08 23:49:34
【问题描述】:

我在 Code::Blocks IDE 中运行了以下 C 代码,它可以正常工作,没有问题。我尝试在 Visual Studio 2015 中编译此代码,但出现此错误:

'strcpy_s': too few arguments for call

如何通过对我的代码进行最少的更改来解决此问题?代码如下:

#include<conio.h>
#include<stdio.h>
#include<string.h>
int main() {
    char string[81];
    int position;
    printf("type a string :");
    gets(string);
    printf("enter position for delete character :");
    scanf_s("%d",&position);
    strcpy_s(&string[position], &string[position + 1]);
    printf("the result string is: ");
    puts(string);
    _getch();
    return 0;
}

Code::Clocks 可以运行此代码并为我提供正确的输出,但 Visual Studio 不能!我能做什么?

【问题讨论】:

标签: c visual-studio visual-studio-2015 strcpy


【解决方案1】:

您正在使用strcpy_s,它是strcpy 的专用版本,它会进行额外的错误检查,并且只需要 3 个参数:

errno_t strcpy_s(char *dest, rsize_t dest_size, const char *src);

我想你真的不需要这个。请改用标准的strcpy 函数:

strcpy(&string[position], &string[position + 1]);

注意:scanf_s 也是如此,如果您没有充分的理由说明 scanf_s 可能对您更有用,请改用 scanf

根据 Code::Blocks 编译代码的原因,它可能只是生成警告而不是中止编译的错误。


好的,事实证明 MSVC 在这方面特别迂腐,不喜欢好的 ol'(更快更简单)的标准函数。

我改为strcpy,但Visual Studio 现在给我这个错误:'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

你有两个选择:

  1. 禁用检查,请参阅此相关问答:How to use _CRT_SECURE_NO_WARNINGS

    基本上只需将其添加到文件的最顶部(在任何 #include 之前):

    #define _CRT_SECURE_NO_WARNINGS
    
  2. 以正确的方式使用strcpy_s(另外,请先检查position &lt; strlen(string),否则您的替换无效):

    strcpy(&string[position], 81 - position, &string[position + 1]);
    

    别忘了检查返回值!


最后,当我们这样做时,使用gets(string)总是错误的。永远不要使用gets()。真的很惊讶 MSVC 没有警告你这一点。请改用fgets

fgets(string, 81, stdin);

【讨论】:

  • 我是standard now,反正+1
  • @Jabberwocky 谢谢,我错误地认为这是某些 Windows 特定功能。
  • 如果我按照你所说的 Visual Studio 不接受并给我这个错误:'strcpy':这个函数或变量可能不安全。考虑改用 strcpy_s。要禁用弃用,请使用 _CRT_SECURE_NO_WARNINGS。有关详细信息,请参阅在线帮助。
  • 关于scanf这个错误:'scanf':这个函数或变量可能不安全。考虑改用 scanf_s。要禁用弃用,请使用 _CRT_SECURE_NO_WARNINGS。详细信息请参见在线帮助。实际上在 code::blocks 我输入了 strcpy 和 scanf ,而不是 strcpy_s 和 scanf_s
  • @MarcoBonelli 非常感谢男士们。非常有帮助。但没有 [#define _CRT_SECURE_NO_WARNINGS],我收到此错误:'-':指针只能从另一个指针中减去。所以我必须像这样编辑你的答案: strcpy_s(&string[position], 81 - (position - string[81]), &string[position + 1]);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 2018-04-22
  • 1970-01-01
  • 2017-10-25
  • 2016-08-16
  • 1970-01-01
相关资源
最近更新 更多