关于用char存储整型,我很好骑
本帖最后由 挥世及至吾 于 2018-8-6 21:27 编辑带你学c带你飞的S1E19,动动手0,代码如下
#include <stdio.h>
int main()
{
signed char str1,str2,i,res,num; //num为整型
printf("请输入第一个字符串:");
scanf("%s",str1);
printf("请输入第二个字符串:");
scanf("%s",str2);
printf("str2 == %d\n",str2); //这边输出为ASCII码
printf("请输入比较的字符数:");
scanf("%d",&num);
printf("str2 == %d\n",str2); //这边输出为0
for (i = res = 0;i < num;i++)
{
if (str1 != str2)
{
res = str1-str2;
break;
}
}
printf("比较的结果是:%d\n",res);
return 0;
}
然后改为用int定义num又正常了,然后我-->{:10_247:},到底为什么呢,我也没看到scanf函数有什么相关规定啊
有没有大帅哥大美女求解释啊啊啊啊啊{:10_266:} 本帖最后由 TyCk 于 2018-8-6 21:59 编辑
仔细读下函数的用法吧,scanf到处是坑{:10_266:} :http://bbs.fishc.org/thread-67391-1-1.html
好吧,网址又换了:https://fishc.com.cn/thread-67391-1-1.html {:10_285:}
楼主,这行代码scanf("%d",&num); {:10_245:}
%d代表有符号整数,%c才代表字符。 字符转整形变ascii 码,整形转字符会有问题。你 scanf 的时候还是要输入字符,打印才换吧 字符转整形变ascii 码,整形转字符会有问题。你 scanf 的时候还是要输入字符,打印才换吧 TyCk 发表于 2018-8-6 21:54
仔细读下函数的用法吧,scanf到处是坑 :http://bbs.fishc.org/thread-67391-1-1.html
好吧,网 ...
%d我知道是整型啊{:10_245:},我本意就是要存储整型,后面循环时用上
话说我看不懂用法啊{:10_266:} claws0n 发表于 2018-8-6 22:09
字符转整形变ascii 码,整形转字符会有问题。你 scanf 的时候还是要输入字符,打印才换吧
可是。可是。{:10_266:},我只是想用char类型的num存一下整型,节省内存,没有转来转去的啊{:10_266:} 挥世及至吾 发表于 2018-8-6 22:20
%d我知道是整型啊,我本意就是要存储整型,后面循环时用上
话说我看不懂用法啊
这个占位符要和后面的变量类型保持一致,不然可能会丢失精度,也就是发生莫名其妙的错误。
如果你想节省内存,只输入256以内的整数,num用char类型,那么这里也要用%c,保证按char类型读取输入。
这样,你需要整数类型的时候,自己在进行类型转换,就可以啦。
像你这里,以整数%d类型读取输入,然后把这个值存到一个char类型变量里,你自己好好想想,非常可能产生问题。 TyCk 发表于 2018-8-6 23:03
这个占位符要和后面的变量类型保持一致,不然可能会丢失精度,也就是发生莫名其妙的错误。
如果你想节省 ...
不,这不是重点{:10_245:},num本身是没问题的,由于存放的是整型,也没有精度问题
我在里面存放的是4啊5啊这些整数,比255远远要小{:10_242:},所以也不存在溢出
如果用%c的话输入的数字就是字符型的,这样的话一个字符变量就只能存一个数字{:10_278:}
嘛,其实用字符型变量存整型的话我也只能先到溢出了,我这里也保证num是signed的了,所以应该没问题?{:10_266:}
其实重点不在num这个变量上,只是搞不懂num带来的问题,整型就没关系,字符型的话str2就莫名奇妙变成0{:10_245:},和输入流有关?还是有鬼作祟?{:10_245:} 挥世及至吾 发表于 2018-8-6 22:25
可是。可是。,我只是想用char类型的num存一下整型,节省内存,没有转来转去的啊
{:10_324:} 有必要这样做吗?好吧,但其实比较不明白你这程序是在感啥的,比较之后的那些数字又说明什么?{:10_245:} claws0n 发表于 2018-8-6 23:25
有必要这样做吗?好吧,但其实比较不明白你这程序是在感啥的,比较之后的那些数字又说明什么 ...
是这里的课程啦 S1E19:字符串处理函数1 | 课后测试题及答案动动手第0题
是没必要这么做,但是要养成节省内存的好习惯嘛{:10_297:},可以直接把num搞成int类型 就不会出bug,但是既然定义为char类型出了bug就要刨根问底嘛。{:10_333:}
顺便一提,我这边是linux系统的 感觉有点深奥{:10_245:},@一波?@小甲鱼 挥世及至吾 发表于 2018-8-6 23:38
感觉有点深奥,@一波?@小甲鱼
楼主,实际测试了下,改成%c是没有问题的。
不知道楼主有没有按我的回答实际测试过?{:10_258:}
我大概明白你的意思了,我觉得这个问题应该和堆栈有关啦。
当你以%d读取输入,整数一般会占用4个字节,按照小端存储以及数组存放第一个值的地址的原理,恰好把str的值覆盖掉。
可以尝试输出一下地址,应该就可以找到问题所在了。 挥世及至吾 发表于 2018-8-6 23:33
是这里的课程啦 S1E19:字符串处理函数1 | 课后测试题及答案动动手第0题
是没必要这么做,但是要养成节 ...
好习惯养成没问题,但是正确调用函数应该也是好习惯的要求之内的吧{:10_266:}
好吧,原谅我的怨念……{:10_256:}
这个问题,说到底,还是scanf调用的时候要匹配啊。
另外说一句,第二部分的printf前,要加一句getchar(),把数据流中的回车符读取扔掉,不然,会影响下面的输入。 #include <stdio.h>
int main(void)
{
char num;
scanf("%d", &num);
printf("0x%X\n", num);
return 0;
}
0x0115F89F 是变量num的地址,现在num中存储的值是0xCC,num的类型是char,在我的系统上是1个字节
0x0115F89F 是变量num的地址,在我的系统上是1个字节,但是后面的3个字节也被scanf修改了
因为是你要scanf以%d输入到char类型的变量
char类型的变量只有一个字节,而scanf的%d要求4个字节
运行时检查发现了这个问题 人造人 发表于 2018-8-6 23:44
这个我就不知道了{:10_245:},我的linux没这个问题,话说问题已经解决了{:10_333:} 人造人 发表于 2018-8-6 23:58
0x0115F89F 是变量num的地址,现在num中存储的值是0xCC,num的类型是char,在我的系统上是1个字节
...
对,就是这问题,{:10_245:},如果在早一点你就可以最佳了{:10_266:},不过还是谢谢
熬夜对身体不好,早睡吧{:10_278:}
页:
[1]