鱼C论坛

 找回密码
 立即注册
查看: 1236|回复: 11

[已解决]我有三个关于数据类型的问题!!!

[复制链接]
发表于 2022-2-7 23:23:21 | 显示全部楼层 |阅读模式

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

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

x
三张图的冲突给我整的有点懵了,诚邀C语言大佬解惑,不甚感激。
最佳答案
2022-2-9 18:01:03
第一个问题:
char *a,把a定义成了一个指针,
这里假设a的地址是1,而a指向的地址是10;
scanf("%s",&a),这里面是往a的地址写入数据;
而printf出来的是a指向的地址的数据;
大致的意思就是你把数据写入了以1起始的地址;
而输出的却是以10起始的地址的数据。

第二个问题:
这个问题也是因为指针,scanf中的&a的数据类型相当于一个数组指针,它指向的是数组a的起始地址,
比如数组a所占有的内存地址是1,2,3;
但是通过这个指针,可以对数组a之后的内存的数据进行操作;
所以就可以输入超过数组a的范围的数据。

第三个问题:
这个就简单了,就是单纯地因为数据越界了,然后被覆盖掉了,
一个中文是占两个字节的,你name定义的是三个字节,
你输入“小甲鱼”,在name存储的只有“小”字 和 “甲”字的一半数据,
所以输出的只有“小”字是对的。

另外,你这个头像我好像在哪见过。

问题0:char*和scanf为什么不兼容,输出为空

问题0:char*和scanf为什么不兼容,输出为空

问题2:为什么a[3],却可以输入超过三个字符

问题2:为什么a[3],却可以输入超过三个字符

问题3:这是小甲鱼课上的实例,为什么输出了中文乱码。前面a[3]则可以输入很字符而顺利输出。

问题3:这是小甲鱼课上的实例,为什么输出了中文乱码。前面a[3]则可以输入很字符而顺利输出。
4.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-7 23:24:46 | 显示全部楼层
注:用的是vscode
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-8 08:18:11 From FishC Mobile | 显示全部楼层
char *a;
scanf("%s", a) // 字符串不要放 &

char a[3];
scanf("%s", a) // 字符串不要放 &
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-8 13:54:13 | 显示全部楼层
本帖最后由 AUUTS 于 2022-2-8 14:02 编辑

第一个不要用%s啊
用%c就行了,你试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-8 13:58:40 | 显示全部楼层
傻眼貓咪 发表于 2022-2-8 08:18
char *a;
scanf("%s", a) // 字符串不要放 &

不懂,是指针吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-8 14:07:33 | 显示全部楼层
第三个不要设置int height
设置成float height,下面的%d也改成%f
应该可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-8 14:12:28 | 显示全部楼层
&是取地址符号,顾名思义,scanf后面需要的是地址;
指针、数组实质就是地址。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-8 14:36:20 From FishC Mobile | 显示全部楼层
FK二十一 发表于 2022-2-8 13:58
不懂,是指针吗

如 7楼 所说,scanf 后面要的就是地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-9 18:01:03 | 显示全部楼层    本楼为最佳答案   
第一个问题:
char *a,把a定义成了一个指针,
这里假设a的地址是1,而a指向的地址是10;
scanf("%s",&a),这里面是往a的地址写入数据;
而printf出来的是a指向的地址的数据;
大致的意思就是你把数据写入了以1起始的地址;
而输出的却是以10起始的地址的数据。

第二个问题:
这个问题也是因为指针,scanf中的&a的数据类型相当于一个数组指针,它指向的是数组a的起始地址,
比如数组a所占有的内存地址是1,2,3;
但是通过这个指针,可以对数组a之后的内存的数据进行操作;
所以就可以输入超过数组a的范围的数据。

第三个问题:
这个就简单了,就是单纯地因为数据越界了,然后被覆盖掉了,
一个中文是占两个字节的,你name定义的是三个字节,
你输入“小甲鱼”,在name存储的只有“小”字 和 “甲”字的一半数据,
所以输出的只有“小”字是对的。

另外,你这个头像我好像在哪见过。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-10 23:07:39 | 显示全部楼层
番杰 发表于 2022-2-9 18:01
第一个问题:
char *a,把a定义成了一个指针,
这里假设a的地址是1,而a指向的地址是10;

1.第一个问题是char*不是char *a,所以我觉得应该不是指针的问题吧(我不确定,还没学到指针。)
2.下面两个问题你这样说的话,是不是因为如果有两个以上的scanf,也就对应了多个变量,那么系统给他们分配
   的内存就是连续的,所以不能越界。只有一个一个变量的时候就可以越界。
3.可能我们在其它区见过吧。
4.感谢大佬赐教!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-11 09:35:43 | 显示全部楼层
FK二十一 发表于 2022-2-10 23:07
1.第一个问题是char*不是char *a,所以我觉得应该不是指针的问题吧(我不确定,还没学到指针。)
2.下面 ...

1.怎么说呢,char * 不是算是一个数据类型(?我太明确应该怎么去描述)
而应该整体的去看char * a,这里的*是修饰a的,表明a是一个指针,char则表示的是这个指针a指向的是char类型的数据。
所以第一题里不是char * 和 scanf不兼容,
而是你用的scanf有问题,后面的&a,应该是a;
原因就是我之前回答的。

2.记住任何时候都不应该让数据越界,这个可能会大致很大的错误,一定注意。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-11 12:09:50 | 显示全部楼层
番杰 发表于 2022-2-11 09:35
1.怎么说呢,char * 不是算是一个数据类型(?我太明确应该怎么去描述)
而应该整体的去看char * a,这 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 13:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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