鱼C论坛

 找回密码
 立即注册
查看: 2648|回复: 9

char定义字符串后再定义一个 unsigned char后前一个失效

[复制链接]
发表于 2016-11-15 21:20:17 | 显示全部楼层 |阅读模式
20鱼币
在做《带你学C带你飞》S1E8课后题时,发现的。代码如下:
#include <stdio.h>

int main(){
        char name[256];
        unsigned char height;
        float mass;
        
        printf("请输入您的姓名:");
        scanf("%s", name);
        
        printf("请输入您的身高(cm)");
        scanf("%u",&height);
        
        printf("请输入您的体重(kg)");
        scanf("%f",&mass);
        
        printf("%s的身高为%.2f(in),体重为%.2f(lb)",name,height/30.48*12,mass*2.2046);
        
        return 0;
}

编译正常,但是运行结果中,name变量始终打印不正确,经各种测试,只要将变量height声明为float形式就可以解决问题,但是不明白为什么,求指点。

最佳答案

查看完整内容

我也觉得很奇怪,在内存中name[256]在height的后面,如果是name[256]在height的前面就不会影响 解决办法是先输入身高再输入姓名,就不会被覆盖,但前提是你知道内存中排列的顺序,所以这样写的话,虽然省了3个byte去存放数值,但在不知道存放顺序的情况下,要运行完或反编译之后再来修正原代码 另外正确的scanf 字符参数,要把输入的无符号数值以一个byte存放的话 是%hhu 这样就不会越界覆盖到name[0]~name[2]的位置 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-15 21:20:18 | 显示全部楼层
本帖最后由 fc1735 于 2016-11-15 23:28 编辑

我也觉得很奇怪,在内存中name[256]在height的后面,如果是name[256]在height的前面就不会影响
#include <stdio.h>

int main(){
        char name[256];
        unsigned char height; //用1个byte来存放数字(0~255)
        float mass;
        
        printf("请输入您的姓名:");
        scanf("%s", name);
        
        printf("请输入您的身高(cm)");
        scanf("%u",&height);  //%u为4个字节,放到height的地址处,数值在256内时,第一个byte存放其数值,后面3个byte均存放0,但后面的地址是前面的name[0] ,name[1],name[2]的内容,故原本输入的名字被0即空字符覆盖掉了
        
        printf("请输入您的体重(kg)");
        scanf("%f",&mass);
        
        printf("%s的身高为%.2f(in),体重为%.2f(lb)",name,height/30.48*12,mass*2.2046); //name[0]为空字符,即返回。
        
        return 0;
}


解决办法是先输入身高再输入姓名,就不会被覆盖,但前提是你知道内存中排列的顺序,所以这样写的话,虽然省了3个byte去存放数值,但在不知道存放顺序的情况下,要运行完或反编译之后再来修正原代码

另外正确的scanf 字符参数,要把输入的无符号数值以一个byte存放的话 是%hhu 这样就不会越界覆盖到name[0]~name[2]的位置

鱼币

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
nocturne25 + 5 + 5 + 3

查看全部评分

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

使用道具 举报

发表于 2016-11-15 22:09:58 | 显示全部楼层
unsigned char height;
scanf("%u",&height);

#include <stdio.h>

int main(){
        char name[256];
        unsigned int height;
        float mass;

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

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

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

        printf("%s的身高为%.2f(in),体重为%.2f(lb)", name, height / 30.48 * 12, mass*2.2046);

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

使用道具 举报

发表于 2016-11-16 16:34:49 | 显示全部楼层
%u,是按4个字节为一个单位输出,而char只占一个字节,所以输出不正确

评分

参与人数 1鱼币 +5 贡献 +3 收起 理由
nocturne25 + 5 + 3 多谢解答.

查看全部评分

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

使用道具 举报

 楼主| 发表于 2016-11-17 17:20:09 | 显示全部楼层
人造人 发表于 2016-11-15 22:09
unsigned char height;
scanf("%u",&height);

朋友,多谢你点进来解答我的问题,不过不好意思啊,是我没说明白困惑的地方,按照我的理解,这里height声明成char形式,结果应该也是正确的,但是事实好像并不如我所想。不明白的是为何如此…
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-11-17 17:53:30 | 显示全部楼层
fc1735 发表于 2016-11-15 21:20
我也觉得很奇怪,在内存中name[256]在height的后面,如果是name[256]在height的前面就不会影响

朋友,我想我大概明白了你的意思,而且,改变顺序以后确实也可以解决这个问题。
但是还是感觉很困惑,以hhu形式输入,只占了一个byte,那应该不会覆盖后面的name[0]~name[2]呀,但结果却还是不对,好奇怪。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-17 18:43:32 | 显示全部楼层
nocturne25 发表于 2016-11-17 17:53
朋友,我想我大概明白了你的意思,而且,改变顺序以后确实也可以解决这个问题。
但是还是感觉很困惑,以 ...

真的吗?改成"%hhu"应该要正常了才对啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-11-17 22:01:13 | 显示全部楼层
fc1735 发表于 2016-11-17 18:43
真的吗?改成"%hhu"应该要正常了才对啊
#include <stdio.h>

int main(){
        char name[256];
        unsigned char height;
        float mass;
        
        printf("请输入您的姓名:");
        scanf("%s", name);
        
        printf("请输入您的身高(cm)");
        scanf("%hhu",&height);
        
        printf("请输入您的体重(kg)");
        scanf("%f",&mass);
        
        printf("%s的身高为%.2f(in),体重为%.2f(lb)",name,height/30.48*12,mass*2.2046);
        
        return 0;
}

在不改变顺序的情况下貌似还是不正常…
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-17 22:25:51 | 显示全部楼层
本帖最后由 fc1735 于 2016-11-17 22:28 编辑

http://stackoverflow.com/questions/15825254/why-is-scanfhhu-char-overwriting-other-variables-when-they-are-local

也有人有同样的问题

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +2 收起 理由
nocturne25 + 5 + 5 + 2

查看全部评分

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

使用道具 举报

 楼主| 发表于 2016-11-17 22:57:32 | 显示全部楼层
fc1735 发表于 2016-11-17 22:25
http://stackoverflow.com/questions/15825254/why-is-scanfhhu-char-overwriting-other-variables-when-th ...

啊哈,英文渣表示看起来略费劲,结论是说,因为我的编译器不支持hhu吗?我试着打印了hhu的长度,的确是1啊…hu应该是2吧..
看来这个问题还比较复杂,感觉,作为一个初学者再深究下去也不一定能很好掌握,我觉得这问题先这样吧,以后再来看这个问题好了。

朋友,多谢了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 15:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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