鱼C论坛

 找回密码
 立即注册
查看: 2428|回复: 16

[已解决]关于用char存储整型,我很好骑

[复制链接]
发表于 2018-8-6 21:26:28 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 挥世及至吾 于 2018-8-6 21:27 编辑

带你学c带你飞的S1E19,动动手0,代码如下
#include <stdio.h>

int main()
{
        signed char str1[256],str2[256],i,res,num; //num为整型

        printf("请输入第一个字符串:");
        scanf("%s",str1);
        printf("请输入第二个字符串:");
        scanf("%s",str2);

        printf("str2 == %d\n",str2[0]); //这边输出为ASCII码

        printf("请输入比较的字符数:");
        scanf("%d",&num);

        printf("str2 == %d\n",str2[0]); //这边输出为0

        for (i = res = 0;i < num;i++)
        {
                if (str1[i] != str2[i])
                {
                        res = str1[i]-str2[i];
                        break;
                }
        }

        printf("比较的结果是:%d\n",res);

        return 0;
}
然后改为用int定义num又正常了,然后我-->,到底为什么呢,我也没看到scanf函数有什么相关规定啊
有没有大帅哥大美女求解释啊啊啊啊啊
最佳答案
2018-8-6 23:44:16
挥世及至吾 发表于 2018-8-6 23:38
感觉有点深奥,@一波?@小甲鱼

捕获·.PNG
捕获.PNG
楼主,实际测试了下,改成%c是没有问题的。
不知道楼主有没有按我的回答实际测试过?

我大概明白你的意思了,我觉得这个问题应该和堆栈有关啦。
当你以%d读取输入,整数一般会占用4个字节,按照小端存储以及数组存放第一个值的地址的原理,恰好把str[256]的值覆盖掉。
可以尝试输出一下地址,应该就可以找到问题所在了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-6 21:54:27 | 显示全部楼层
本帖最后由 TyCk 于 2018-8-6 21:59 编辑

仔细读下函数的用法吧,scanf到处是坑 :http://bbs.fishc.org/thread-67391-1-1.html
好吧,网址又换了:https://fishc.com.cn/thread-67391-1-1.html

楼主,这行代码scanf("%d",&num);
%d代表有符号整数,%c才代表字符。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-6 22:07:42 From FishC Mobile | 显示全部楼层
字符转整形变ascii 码,整形转字符会有问题。你 scanf 的时候还是要输入字符,打印才换吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-6 22:09:53 From FishC Mobile | 显示全部楼层
字符转整形变ascii 码,整形转字符会有问题。你 scanf 的时候还是要输入字符,打印才换吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-6 22:20:40 | 显示全部楼层
TyCk 发表于 2018-8-6 21:54
仔细读下函数的用法吧,scanf到处是坑 :http://bbs.fishc.org/thread-67391-1-1.html
好吧,网 ...

%d我知道是整型啊,我本意就是要存储整型,后面循环时用上
话说我看不懂用法啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-6 22:25:35 | 显示全部楼层
claws0n 发表于 2018-8-6 22:09
字符转整形变ascii 码,整形转字符会有问题。你 scanf 的时候还是要输入字符,打印才换吧

可是。可是。,我只是想用char类型的num存一下整型,节省内存,没有转来转去的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-6 23:03:25 | 显示全部楼层
挥世及至吾 发表于 2018-8-6 22:20
%d我知道是整型啊,我本意就是要存储整型,后面循环时用上
话说我看不懂用法啊

这个占位符要和后面的变量类型保持一致,不然可能会丢失精度,也就是发生莫名其妙的错误。
如果你想节省内存,只输入256以内的整数,num用char类型,那么这里也要用%c,保证按char类型读取输入。
这样,你需要整数类型的时候,自己在进行类型转换,就可以啦。
像你这里,以整数%d类型读取输入,然后把这个值存到一个char类型变量里,你自己好好想想,非常可能产生问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-6 23:24:34 | 显示全部楼层
TyCk 发表于 2018-8-6 23:03
这个占位符要和后面的变量类型保持一致,不然可能会丢失精度,也就是发生莫名其妙的错误。
如果你想节省 ...

不,这不是重点,num本身是没问题的,由于存放的是整型,也没有精度问题
我在里面存放的是4啊5啊这些整数,比255远远要小,所以也不存在溢出
如果用%c的话输入的数字就是字符型的,这样的话一个字符变量就只能存一个数字
嘛,其实用字符型变量存整型的话我也只能先到溢出了,我这里也保证num是signed的了,所以应该没问题?

其实重点不在num这个变量上,只是搞不懂num带来的问题,整型就没关系,字符型的话str2[0]就莫名奇妙变成0,和输入流有关?还是有鬼作祟?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-6 23:25:17 | 显示全部楼层
挥世及至吾 发表于 2018-8-6 22:25
可是。可是。,我只是想用char类型的num存一下整型,节省内存,没有转来转去的啊

有必要这样做吗?好吧,但其实比较不明白你这程序是在感啥的,比较之后的那些数字又说明什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-6 23:33:41 | 显示全部楼层
claws0n 发表于 2018-8-6 23:25
有必要这样做吗?好吧,但其实比较不明白你这程序是在感啥的,比较之后的那些数字又说明什么 ...

是这里的课程啦 S1E19:字符串处理函数1 | 课后测试题及答案动动手第0题
是没必要这么做,但是要养成节省内存的好习惯嘛,可以直接把num搞成int类型 就不会出bug,但是既然定义为char类型出了bug就要刨根问底嘛。

顺便一提,我这边是linux系统的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-6 23:38:08 | 显示全部楼层
感觉有点深奥,@一波?@小甲鱼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-6 23:44:16 | 显示全部楼层    本楼为最佳答案   
挥世及至吾 发表于 2018-8-6 23:38
感觉有点深奥,@一波?@小甲鱼

捕获·.PNG
捕获.PNG
楼主,实际测试了下,改成%c是没有问题的。
不知道楼主有没有按我的回答实际测试过?

我大概明白你的意思了,我觉得这个问题应该和堆栈有关啦。
当你以%d读取输入,整数一般会占用4个字节,按照小端存储以及数组存放第一个值的地址的原理,恰好把str[256]的值覆盖掉。
可以尝试输出一下地址,应该就可以找到问题所在了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-8-6 23:44:26 | 显示全部楼层
GIF.gif
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-6 23:48:12 | 显示全部楼层
挥世及至吾 发表于 2018-8-6 23:33
是这里的课程啦 S1E19:字符串处理函数1 | 课后测试题及答案动动手第0题
是没必要这么做,但是要养成节 ...

好习惯养成没问题,但是正确调用函数应该也是好习惯的要求之内的吧
好吧,原谅我的怨念……
这个问题,说到底,还是scanf调用的时候要匹配啊。
另外说一句,第二部分的printf前,要加一句getchar(),把数据流中的回车符读取扔掉,不然,会影响下面的输入。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-6 23:58:17 | 显示全部楼层
#include <stdio.h>

int main(void)
{
        char num;
        scanf("%d", &num);
        printf("0x%X\n", num);
        return 0;
}
1.png

0x0115F89F 是变量num的地址,现在num中存储的值是0xCC,num的类型是char,在我的系统上是1个字节


2.png
0x0115F89F 是变量num的地址,在我的系统上是1个字节,但是后面的3个字节也被scanf修改了
因为是你要scanf以%d输入到char类型的变量
char类型的变量只有一个字节,而scanf的%d要求4个字节


3.png
运行时检查发现了这个问题

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
挥世及至吾 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

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

使用道具 举报

 楼主| 发表于 2018-8-7 00:01:07 | 显示全部楼层

这个我就不知道了,我的linux没这个问题,话说问题已经解决了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-7 00:04:37 | 显示全部楼层
人造人 发表于 2018-8-6 23:58
0x0115F89F 是变量num的地址,现在num中存储的值是0xCC,num的类型是char,在我的系统上是1个字节

...

对,就是这问题,,如果在早一点你就可以最佳了,不过还是谢谢

熬夜对身体不好,早睡吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-2 08:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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