c - 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 不能!我能做些什么?
解决方案
您正在使用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
如果您没有充分的理由说明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.
你有两个选择:
禁用检查,请参阅此相关问题和答案:如何使用 _CRT_SECURE_NO_WARNINGS。
基本上只需将其添加到文件的最顶部(在 any 之前
#include
):#define _CRT_SECURE_NO_WARNINGS
以正确的方式使用
strcpy_s
(另外,请先检查position < strlen(string)
,否则您的替换无效):strcpy(&string[position], 81 - position, &string[position + 1]);
并且不要忘记检查返回值!
最后,当我们这样做时,使用总是gets(string)
错误的。永远不要使用. 真的很惊讶 MSVC 没有警告你这一点。改用:gets()
fgets
fgets(string, 81, stdin);
推荐阅读
- python - Google Colaboratory 上的 Tensorflow 2.x 自定义损失函数
- c# - 找不到类型或命名空间名称“GameManager”
- c# - 如何在 C# linq 中编写一对多关系查询
- excel - VBA。如何从网页下载文本而不是 .csv
- java - 程序似乎没有从数组中读取数据:NumberFormatException:空字符串
- spring-boot - 在 JPA 存储库中的 findAll() 之后调用 Save()
- firebase - Unity / iOS App中的Firebase身份验证,无需电子邮件和密码
- c++ - 我有一个问题,我一直在尝试 LeetCode,需要帮助解决超出时间限制的错误
- css - CSS模板未在jsPsych中加载
- r - 基于条件的闪亮地块