Visual Studio error: 'strcpy_s': too few arguments for call

Visual Studio error: 'strcpy_s': too few arguments for call

我在 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 不能!我能做什么?

您正在使用 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'(更快更简单)标准函数。

I changed to strcpy but Visual studio gives me this error now: '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 < strlen(string),否则您的替换无效):

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

    并且不要忘记检查 return 值!


最后,当我们使用 gets(string) 时,总是 是错误的。永远不要使用 gets()。真的很惊讶 MSVC 没有就此警告您。使用 fgets 代替:

fgets(string, 81, stdin);