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.
您有两个选择:
禁用检查,请参阅此相关问答:How to use _CRT_SECURE_NO_WARNINGS。
基本上只需将其添加到文件的最顶部(在任何 #include
之前):
#define _CRT_SECURE_NO_WARNINGS
以正确的方式使用strcpy_s
(另外,请先检查position < strlen(string)
,否则您的替换无效):
strcpy(&string[position], 81 - position, &string[position + 1]);
并且不要忘记检查 return 值!
最后,当我们使用 gets(string)
时,总是 是错误的。永远不要使用 gets()
。真的很惊讶 MSVC 没有就此警告您。使用 fgets
代替:
fgets(string, 81, stdin);
我在 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.
您有两个选择:
禁用检查,请参阅此相关问答:How to use _CRT_SECURE_NO_WARNINGS。
基本上只需将其添加到文件的最顶部(在任何
#include
之前):#define _CRT_SECURE_NO_WARNINGS
以正确的方式使用
strcpy_s
(另外,请先检查position < strlen(string)
,否则您的替换无效):strcpy(&string[position], 81 - position, &string[position + 1]);
并且不要忘记检查 return 值!
最后,当我们使用 gets(string)
时,总是 是错误的。永远不要使用 gets()
。真的很惊讶 MSVC 没有就此警告您。使用 fgets
代替:
fgets(string, 81, stdin);