C6064:缺少“scanf_s”的整型参数(对应于转换说明符“2”

项目场景:

学习过程遇见的问题,出现两个警告,一个是关于C6054:可能没有为字符串“name”添加字符串零终警告,另一个是关于C6064:缺少“scanf_s”的整型参数(对应于转换说明符“2”,因为篇幅太长,本片只介绍C6064:缺少“scanf_s”的整型参数(对应于转换说明符“2”,警告C6054请移

警告C6054


问题描述

// talkback.c -- 演示与用户交互
#include 
#include  // 提供strlen()函数的原型
#define DENSITY 62.4 // 人体密度(单位:磅/立方英尺)
int main()
{
	float weight, volume;
	int size, letters;
	char name[40] = {0}; /* 声明字符串name, name是一个可容纳40个字符的数组 */
	printf("Hi! What's your first name?\n");
	scanf_s("%s", name);
	printf("%s, what's your weight in pounds?\n", name);
	scanf_s("%f", &weight);
	size = sizeof name;
	letters = strlen(name); /* strlen()函数的使用 */
	volume = weight / DENSITY;
	printf("Well, %s, your volume is %2.2f cubic feet.\n", name, volume);
	printf("Also, your first name has %d letters,\n", letters);
	printf("and we have %d bytes to store it.\n", size);
	return 0;
}

以上是源代码,大家可以试着运行,我调试并没有报错,并也出现了弹窗,但运行的结果视乎纯在问题,判断不正常情况理由。程序目的是实现与用户的交互,代码中使用两次scanf_s()输入函数,所以用户应当输入两次,实现两次交互效果,请看下面调试输出图:,

C6064:缺少“scanf_s”的整型参数(对应于转换说明符“2”_第1张图片

正常情况应该如下:

C6064:缺少“scanf_s”的整型参数(对应于转换说明符“2”_第2张图片

所以还一部内容哪去了???关闭弹窗,编译出现警告

C6064:缺少“scanf_s”的整型参数(对应于转换说明符“2”_第3张图片


原因分析:

//scanf_s("%s", name);    对于变量name这个字符串,没有传入字符串长度的参数,因为在调用scanf_s()函数时,如果必须提供一个数字以表明最多读取多少位字符。比如:char d[20];写成scanf_s("%s",d,20);才是正确的,有这个参数20使准确性、安全性提高。


解决方案:

C6064:缺少“scanf_s”的整型参数(对应于转换说明符“2”_第4张图片

 修改完后,运行结果如下图:

C6064:缺少“scanf_s”的整型参数(对应于转换说明符“2”_第5张图片

-------------------------------------分------------割-----------线---------------------------------------------------------

补充内容:在有些时候并不需要传入字符串长度的参数

像scanf_s()函数要求输入的类型是%c(单个字符)、要求输入的类型是%d(十进制整数)、要求输入的类型为%f(浮点型).....等等。换句话,只有当函数要求传入的类型是%s(字符串)时,才要需要传入字符串长度的参数

像下面的这段代码:

#include 
int main(void) /* 函数原型,主函数 */
{
	char zifu; /* 声明字符类型变量名为zifu */
	printf("请输入你想输入的字符:");
	scanf_s("%c", &zifu); 
	printf("你输入的字符是: %c,它的代码编号是:%d", zifu, zifu); /* ①打印字符②打印十进制整数 */
	return 0;
}

到此,问题已经解决,欢迎在评论区交流,若有不对地方,请指正,共勉

另外,如果分不清scanf()和scanf_s(),请看链接,博主也有些地方引用其中内容

http://t.csdn.cn/3JxhK

你可能感兴趣的:(C语言,visual,studio,c#,c语言,c++)