C言語のscanf_s関数はエラーの問題を使用します
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呼び出しにも1つのパラメーターがありません(十分なパラメーターを渡さない)。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;
}