djiewj40 发表于 2021-11-18 22:15:38

请问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;
}

djiewj40 发表于 2021-11-18 22:16:22

运行结果指输入了名字程序就结束了。

人造人 发表于 2021-11-18 22:25:10

六版第四章 的内容是什么?
我不想去买这本书
给你解答问题,我还得去买这本书

虽然说通过看代码也能把题目猜个大概,但是你的代码是错误的(如果没有错误你也不会提问题对吧)
看着错误的代码去猜题目
真的,我会选择放弃回答这个问题

你直接把题目发出来不就好了,非要指一个位置,然后说你的题目在那个位置,要我们去那个位置来得到你的问题

人造人 发表于 2021-11-18 22:28:01

不要用 _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;
}

djiewj40 发表于 2021-11-22 20:14:40

人造人 发表于 2021-11-18 22:25
六版第四章 的内容是什么?
我不想去买这本书
给你解答问题,我还得去买这本书


第四章内容是字符串和格式化输入/输出。这个是示例不是题目,但是在VS2022里运行不了

djiewj40 发表于 2021-11-22 21:10:47

人造人 发表于 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]
查看完整版本: 请问Cprimer第六版第四章程序运行结果有误,原因在哪里?