鱼C论坛

 找回密码
 立即注册
查看: 1453|回复: 5

请问Cprimer第六版第四章程序运行结果有误,原因在哪里?

[复制链接]
发表于 2021-11-18 22:15:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <string.h>
#define DENSITY 62.4
int main()
{
        float weight, volume;
        int size, letters;
        char 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 letter,\n", letters);
        printf("and we have %d bytes to store it.\n", size);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-11-18 22:16:22 | 显示全部楼层
运行结果指输入了名字程序就结束了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-18 22:25:10 | 显示全部楼层
六版第四章 的内容是什么?
我不想去买这本书
给你解答问题,我还得去买这本书

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

你直接把题目发出来不就好了,非要指一个位置,然后说你的题目在那个位置,要我们去那个位置来得到你的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[40];

    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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-22 20:14:40 | 显示全部楼层
人造人 发表于 2021-11-18 22:25
六版第四章 的内容是什么?
我不想去买这本书
给你解答问题,我还得去买这本书

第四章内容是字符串和格式化输入/输出。这个是示例不是题目,但是在VS2022里运行不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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));


按照上面的说法改成这样就可以用了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-10 02:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表