问题描述
我已经在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
,它是lorem10
的专门版本,它执行附加的错误检查,并且恰好需要3个参数:
strcpy
我想你真的不需要这个。请使用标准的errno_t strcpy_s(char *dest,rsize_t dest_size,const char *src);
函数:
strcpy
注意:strcpy(&string[position],&string[position + 1]);
也是一样,如果您没有充分的理由说明scanf_s
对您更有用,请使用scanf
。
按照为什么Code :: Blocks编译代码的原因,好吧,它可能只是生成警告而不是中止编译的错误。
好吧,事实证明MSVC对此特别感兴趣,并且不喜欢良好的ol'(更快,更简单)的标准功能。
我更改为
scanf_s
,但是Visual Studio现在给我这个错误:strcpy
您有两个选择:
-
禁用该检查,请参阅以下相关问题和答案:How to use _CRT_SECURE_NO_WARNINGS。
基本上将其添加到文件的顶部(在任何
'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.
之前):#include
-
以正确的方式使用
#define _CRT_SECURE_NO_WARNINGS
(也请首先检查strcpy_s
,否则替换无效):position < strlen(string)
别忘了检查返回值!
最后,当我们使用它时,使用strcpy(&string[position],81 - position,&string[position + 1]);
总是错误的。切勿使用gets(string)
。真的很惊讶,MSVC对此没有发出警告。请改用gets()
:
fgets