请问Cprimer第六版第四章程序运行结果有误,原因在哪里?
#include <stdio.h>#include <string.h>
#define DENSITY 62.4
int main()
{
float weight, volume;
int size, letters;
char name;
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 letter,\n", letters);
printf("and we have %d bytes to store it.\n", size);
return 0;
} 运行结果指输入了名字程序就结束了。 六版第四章 的内容是什么?
我不想去买这本书
给你解答问题,我还得去买这本书
虽然说通过看代码也能把题目猜个大概,但是你的代码是错误的(如果没有错误你也不会提问题对吧)
看着错误的代码去猜题目
真的,我会选择放弃回答这个问题
你直接把题目发出来不就好了,非要指一个位置,然后说你的题目在那个位置,要我们去那个位置来得到你的问题
不要用 _s 版本的函数
#include <stdio.h>
#include <string.h>
#define DENSITY 62.4
int main() {
float weight, volume;
int size, letters;
char name;
printf("Hi!What's your first name?\n");
//scanf_s("%s", &name);
scanf("%s", name);
printf("%s,What's your weight in pounds?\n", name);
//scanf_s("%f", &weight);
scanf("%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 letter,\n", letters);
printf("and we have %d bytes to store it.\n", size);
return 0;
}
人造人 发表于 2021-11-18 22:25
六版第四章 的内容是什么?
我不想去买这本书
给你解答问题,我还得去买这本书
第四章内容是字符串和格式化输入/输出。这个是示例不是题目,但是在VS2022里运行不了 人造人 发表于 2021-11-18 22:28
不要用 _s 版本的函数
找到了答案
1. 来历
C99标准库中提供的输入函数scanf()有个缺陷:它不检查键盘输入的信息长度是否小于存储信息的缓冲区的长度,从而导致某些难以检查的越界、溢出甚至是代码安全问题。
C11标准库中提供了所谓的“安全函数”,是在C99标准库中的函数名后面加上“_s”后缀。这些安全函数提供了更多的参数,用于指定缓冲区的大小,从而变得“安全”。这类函数有 printf_s(); scanf_s(); sprintf_s(); fscanf_s(); 等等
微软在他的C++编译器中(对,没有写错,是兼容部分C语言标准的C++编译器)提供的这些所谓的安全函数与C11标准并不兼容。
2. 用法
scanf_s() 是一个可变参数函数,原型如下:
int scanf_s(const char * restrict format, ...);
scanf_s的参数用法与scanf相近,除了遇到c, s 和 [ 这三个转换符时要使用一对参数。这一对参数中,第一个参数与scanf相同,而紧随第一个参数之后的第二个参数的类型是rsize_t (C头文件中定义的一个类型,一种实现方式是 typedef size_t rsize_t; ) 用于指定第一个参数所指向的缓冲区可以容纳的元素的数量。
对于题主的情况,第12行应该改为scanf_s("%s", name, sizeof(name));
按照上面的说法改成这样就可以用了
页:
[1]