zhao_lh 发表于 2019-11-10 17:23:28

课外题遇到的一个问题

#include <stdio.h>

int main()
{
      char name;
      float height, weight;

      printf("请输入您的姓名:");
      scanf("%s", name);

      printf("请输入您的身高(cm):");
      scanf("%f", &height);

      printf("请输入您的体重(kg):");
      scanf("%f", &weight);

      printf("========== 正在为您转换 ==========\n");

      height = height / 2.54; // 厘米转换为英寸
      weight = weight / 0.453; // 公斤转换为磅

      printf("%s的身高是%.2f(in),体重是%.2f(lb)。\n", name, height, weight);

      return 0;
}



第五行   char name中的 有什么作用,为什么没有这个就不能正常运行,[]里面的数字是什么意思_(:з」∠)

ba21 发表于 2019-11-10 17:56:36

完了,你这编程是怎么学的?
数组的概念还不清楚????

jackz007 发表于 2019-11-10 18:16:12

本帖最后由 jackz007 于 2019-11-10 18:18 编辑

      int i , j, k   ;
      char name ;
      如果这样声明变量,那么,编译程序会为 i ,j ,k 各分配 4 个字节内存空间,用于保存变量的内容,因为每个 int 型变量占用 4 个字节;会为 name 分配 256 个字节单元,供 name 使用,因为 1 个 ASCII 字符占用 1 个字节,这样,name 中总共可以容纳 256 个字符,但是,扣除字符串末尾的结束标志 '\0',name 最多能够有效储存 255 个字符,就是说,name 所能保存的字符串的最大长度不能超过 255。

tommyyu 发表于 2019-11-10 20:57:18

定义数组长度

zhao_lh 发表于 2019-11-10 21:44:01

jackz007 发表于 2019-11-10 18:16
如果这样声明变量,那么,编译程序会为 i ,j ,k 各分配 4 个字节内存空间,用于保存变量的内容 ...

你好,我把改成为什么还可以正常运行

jackz007 发表于 2019-11-10 21:59:23

本帖最后由 jackz007 于 2019-11-10 22:06 编辑

zhao_lh 发表于 2019-11-10 21:44
你好,我把改成为什么还可以正常运行

      char name
      如果这样定义 name,那么,编译程序不会为 name 分配空间,如果向 name 中储存字符串,那么,就会侵占其他变量占用的空间,导致占用相关内存的其他变量数值或内容发生非预期的改变,如果这些变量赋值,又会反过来破坏 name 的内容,因为这些内存本来就是编译程序为这些变量分配的合法空间。

         只要运行一下下面的代码,就可以看到字符串变量 b 是如何袭夺字符串变量 a 的空间的。
#include <stdio.h>
#include <string.h>

int main(void)
{
      char a , b            ;
      strcpy(a , "Hello , world !") ;
      printf("%s\n" , a)            ; // 正常显示 "Hello , world !\n"
      strcpy(b , "I love fishC !"); // 表面上改变的是 b,实际上改变的是 a
      printf("%s\n" , a)            ; // 显示的并不是 "Hello , world !\n",而是 "I love fishC !\n"
}
      下面是编译、运行实况
C:\Bin>g++ -o x x.c

C:\Bin>x
hello , world !
I love fishC !

C:\Bin>

zhao_lh 发表于 2019-11-11 17:34:08

jackz007 发表于 2019-11-10 21:59
如果这样定义 name,那么,编译程序不会为 name 分配空间,如果向 name 中储存字符串,那么 ...

虽然我运行结果是两个hello word,但是明白你的意思了,谢谢啦。{:5_106:}

jackz007 发表于 2019-11-11 18:19:18

zhao_lh 发表于 2019-11-11 17:34
虽然我运行结果是两个hello word,但是明白你的意思了,谢谢啦。

       如果你那里是两个 "hello,world" ,那就是编译器有区别,把这一句:
      char a , b ;
      改成这样再试试:
      char a , b ;

zhao_lh 发表于 2019-11-11 22:03:17

jackz007 发表于 2019-11-11 18:19
如果你那里是两个 "hello,world" ,那就是编译器有区别,把这一句:

      改成这样再试试 ...

还是不行哦,我用的是Dev-c++

jackz007 发表于 2019-11-11 22:07:40

zhao_lh 发表于 2019-11-11 22:03
还是不行哦,我用的是Dev-c++

       是啊,DEV C++ 用的是 TDM GCC ,和我使用的是完全一样的编译器呀,没有道理。改过以后还是显示 2 个相同的 "hello , world!" ?

zhao_lh 发表于 2019-11-12 17:22:11

对。小甲鱼C语言的视频里面是有装虚拟机的,我没有装,会不会是这个原因

zhao_lh 发表于 2019-11-12 17:22:48

jackz007 发表于 2019-11-11 22:07
是啊,DEV C++ 用的是 TDM GCC ,和我使用的是完全一样的编译器呀,没有道理。改过以后还是显示 ...

对。小甲鱼C语言的视频里面是有装虚拟机的,我没有装,会不会是这个原因

jackz007 发表于 2019-11-12 18:23:37

zhao_lh 发表于 2019-11-12 17:22
对。小甲鱼C语言的视频里面是有装虚拟机的,我没有装,会不会是这个原因

       虚拟机只是提供一个 Linux 的系统环境,以便使用 GNU 的 C / C++ 编译器,和这个问题无关。
页: [1]
查看完整版本: 课外题遇到的一个问题