鱼C论坛

 找回密码
 立即注册
查看: 1534|回复: 12

[已解决]求助求助

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

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

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

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

        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 butes to store it.\n", size);

        return 0;
}

在我编译后,第一次输入参数时,程序就不会继续下去了只会显示
Hi! What's your first name?
abc

然后就不动了。
在vscode里面会显示
0x0F62D4EC (ucrtbased.dll)处(位于 Code list 4.1 talkback.c.exe 中)引发的异常: 0xC0000005: 写入位置 0x00B00000 时发生访问冲突。

并在第一个scanf_s后面打一个×,我用的是vs code 2019。
最佳答案
2019-11-7 06:30:45
楼上的两位你们跑偏了。。

回答楼主的问题
scanf_s作为scanf的“安全版”,为了防止溢出,在读取字符串时,需要同时提供字符串长度:
        scanf_s("%s", name,sizeof(name));
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-7 00:44:30 | 显示全部楼层
本帖最后由 jackz007 于 2019-11-7 00:47 编辑

        size = sizeof name      ; // VC 2019 的函数 sizeof() 可以不用写括号了?
        是不是得加上括号?
        size = sizeof(name)    ;

        我用 TDM GCC 5.1.0 成功编译,并成功运行
        下面是编译、运行实况:
C:\Bin>g++ -o x x.c

C:\Bin>x
Hi! What's your first name?
jackz007
jackz007 , what's your weight in pounds?
160
Well , jackz007 , your volume is 2.56 cubic feet.
Also, your first name has 8 letters,
and we have 10 bytes to store it.

C:\Bin>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-7 01:07:13 | 显示全部楼层
jackz007 发表于 2019-11-7 00:44
size = sizeof name      ; // VC 2019 的函数 sizeof() 可以不用写括号了?
        是不是得加 ...


sizeof不是函数
#include <stdio.h>

int main(void)
{
        char name[20];
        printf("%u\n", sizeof name);
        return 0;
}
// 20
// 请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-7 01:12:28 | 显示全部楼层

       sizeof name 还用算吗,不是定义的 20 吗?
       sizeof 这么用还是头一次见,算是开眼了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-7 02:05:24 | 显示全部楼层
jackz007 发表于 2019-11-7 01:12
sizeof name 还用算吗,不是定义的 20 吗?
       sizeof 这么用还是头一次见,算是开眼了。
#include <stdio.h>

int main(void)
{
        int arr[10];
        size_t arr_size = sizeof arr;
        printf("%u\n", arr_size);
        return 0;
}

// 40
// 请按任意键继续. . .

这次呢?你总不能说一个int是4个字节,4 * 10 = 40个字节吧?
int在不同的环境下大小很可能会不同,保险的做法就是使用sizeof关键字,让编译器来告诉我们arr占用的内存大小
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-7 06:30:45 | 显示全部楼层    本楼为最佳答案   
楼上的两位你们跑偏了。。

回答楼主的问题
scanf_s作为scanf的“安全版”,为了防止溢出,在读取字符串时,需要同时提供字符串长度:
        scanf_s("%s", name,sizeof(name));
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-7 09:10:20 From FishC Mobile | 显示全部楼层
楼主用的啥编译器?
我用VScode如果函数使用不正确,会有智能提示,不用调试都知道肯定通不过编译器的检查
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-7 10:59:01 | 显示全部楼层
bin554385863 发表于 2019-11-7 09:10
楼主用的啥编译器?
我用VScode如果函数使用不正确,会有智能提示,不用调试都知道肯定通不过编译器的检查

我用的VS CODE啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-7 11:01:56 | 显示全部楼层
Croper 发表于 2019-11-7 06:30
楼上的两位你们跑偏了。。

回答楼主的问题

感谢感谢,您的方法解决了我的问题。sizeof(name)是不是相当于量体裁衣?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-7 11:13:12 | 显示全部楼层
人造人 发表于 2019-11-7 02:05
这次呢?你总不能说一个int是4个字节,4 * 10 = 40个字节吧?
int在不同的环境下大小很可能会不同, ...

感谢回复,本人知识有限,并不能完全理解您的意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-7 11:16:07 | 显示全部楼层
jackz007 发表于 2019-11-7 01:12
sizeof name 还用算吗,不是定义的 20 吗?
       sizeof 这么用还是头一次见,算是开眼了。

感谢回复。
上面代码,为抄写C primer plus第6版,第4章,程序清单4.1 talkback.c程序。
由于我刚学到这里,就直接抄写下来,先运行试试。
事先并不知道sizeof的具体用法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-7 11:26:23 | 显示全部楼层
初触 发表于 2019-11-7 10:59
我用的VS CODE啊。

VScode函数不正确会有提示
360截图20191107112343198.bmp
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-7 13:22:32 | 显示全部楼层
bin554385863 发表于 2019-11-7 11:26
VScode函数不正确会有提示

哦哦,知道了,谢谢啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-4 19:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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