初触 发表于 2019-11-6 22:50:18

求助求助

// talkback.c -- 演示与用户交互
#include<stdio.h>
#include<string.h>      //提供strlen()函数的原型
#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 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。

jackz007 发表于 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>

人造人 发表于 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;
        printf("%u\n", sizeof name);
        return 0;
}
// 20
// 请按任意键继续. . .

jackz007 发表于 2019-11-7 01:12:28

人造人 发表于 2019-11-7 01:07
sizeof不是函数

       sizeof name 还用算吗,不是定义的 20 吗?
       sizeof 这么用还是头一次见,算是开眼了。

人造人 发表于 2019-11-7 02:05:24

jackz007 发表于 2019-11-7 01:12
sizeof name 还用算吗,不是定义的 20 吗?
       sizeof 这么用还是头一次见,算是开眼了。

#include <stdio.h>

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

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


这次呢?你总不能说一个int是4个字节,4 * 10 = 40个字节吧?
int在不同的环境下大小很可能会不同,保险的做法就是使用sizeof关键字,让编译器来告诉我们arr占用的内存大小

Croper 发表于 2019-11-7 06:30:45

楼上的两位你们跑偏了。。

回答楼主的问题
scanf_s作为scanf的“安全版”,为了防止溢出,在读取字符串时,需要同时提供字符串长度:      scanf_s("%s", name,sizeof(name));

bin554385863 发表于 2019-11-7 09:10:20

楼主用的啥编译器?
我用VScode如果函数使用不正确,会有智能提示,不用调试都知道肯定通不过编译器的检查

初触 发表于 2019-11-7 10:59:01

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

我用的VS CODE啊。

初触 发表于 2019-11-7 11:01:56

Croper 发表于 2019-11-7 06:30
楼上的两位你们跑偏了。。

回答楼主的问题


感谢感谢,您的方法解决了我的问题。sizeof(name)是不是相当于量体裁衣?

初触 发表于 2019-11-7 11:13:12

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

感谢回复,本人知识有限,并不能完全理解您的意思。

初触 发表于 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的具体用法。

bin554385863 发表于 2019-11-7 11:26:23

初触 发表于 2019-11-7 10:59
我用的VS CODE啊。

VScode函数不正确会有提示

初触 发表于 2019-11-7 13:22:32

bin554385863 发表于 2019-11-7 11:26
VScode函数不正确会有提示

哦哦,知道了,谢谢啊
页: [1]
查看完整版本: 求助求助