首页 > 解决方案 > Visual Studio 错误:“strcpy_s”:调用的参数太少

问题描述

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

标签: cvisual-studiovisual-studio-2015strcpy

解决方案


您正在使用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_sscanf如果您没有充分的理由说明scanf_s可能对您更有用,请改用。

根据 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. 禁用检查,请参阅此相关问题和答案:如何使用 _CRT_SECURE_NO_WARNINGS

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

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

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

    并且不要忘记检查返回值!


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

fgets(string, 81, stdin);

推荐阅读