【C/C++--ERROR】:scanf_s函数获取数组时需要2个参数(名称,字符长度)

1.代码:talkback.c – 演示与用户交互

// talkback.c -- 演示与用户交互
#include <stdio.h>
#include <string.h>  // 提供strlen()函数的原型
#define DENSITY 62.4 // 人体密度(单位:磅/立方英尺)
int main(void) {
	float weight, volume;
	int size, letters;
	char name[40];  //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);
	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;
}

2.报错如下:

在编译时会出现如下警告,且运行时scanf_s后续代码无法运行:

1>e:\talkback.c(17): warning C4244:=: 从“double”转换到“float”,可能丢失数据
1>e:\talkback.c(11): warning C4473: “scanf_s”: 没有为格式字符串传递足够的参数
1>e:\talkback.c(11): note: 占位符和其参数预计 2 可变参数,但提供的却是 1 参数
1>e:\talkback.c(11): note: 缺失的可变参数 2 为格式字符串“%s”所需
1>e:\talkback.c(11): note: 此参数用作缓冲区大小

3.原因分析:

根据上面警告提示,scanf_s的调用还缺少一个参数(没有传递足够的参数),scanf_s是scanf的安全版本,需要表示数组长度的参数,所以正确的调用应该是:

scanf_s("%s", name, 40);

4.完整代码:

// talkback.c -- 演示与用户交互
#include <stdio.h>
#include <string.h>  // 提供strlen()函数的原型
#define DENSITY 62.4 // 人体密度(单位:磅/立方英尺)
int main(void) {
	float weight, volume;
	int size, letters;
	char name[40];  //name是一个可容纳40个字符的数组

	printf("Hi, What's your first name?\n");
	scanf_s("%s", name, 40);
	printf("%s,what's your weight in pounds?\n", name);
	
	scanf_s("%f", &weight);
	size = sizeof name;
	letters = strlen(name);
	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;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值