免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2646 | 回复: 16
打印 上一主题 下一主题

[C] 《品悟C》疑问2 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-14 10:33 |只看该作者 |倒序浏览
《品悟C》92页
问题14中的第二段代码。
         char ch0 = 'E',ch1 = 'R',ch2 = 'R';
        printf("%c%c%c", ch0, ch1, ch2);

        scanf("%3c", &ch2);
        printf("%c%c%c", ch0, ch1, ch2);
书里说输入是abc,这个例子用来说明scanf("%c")不只能改变一个字符的内存。
这段代码结果是E R R
                   c  b  a

按照书中的代码,我运行结果是ERR
                                       ERa

如果第三行代码改成ch0,同样的输入,输出为ERR
                                                           aRR                        

我使用VC6.0尝试的。请大家看一下

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 2012-10-14 10:41 |只看该作者
说明scanf("%c")不只能改变一个字符的内存

这么神奇?

论坛徽章:
0
3 [报告]
发表于 2012-10-14 11:06 |只看该作者
原来每个ch,在这里都是4字节的,所以出现了问题。
程序改成char ch0 = 'E',ch1 = 'R',ch2 = 'R';
        printf("%c%c%c", ch0, ch1, ch2);

        scanf("%9c", &ch2);
        printf("%c%c%c", ch0, ch1, ch2);
连续输入9个a,结果为:ERR
                                  aaa
说明变量以4字节的整数地址来分配给变量的,对么?

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
4 [报告]
发表于 2012-10-14 11:16 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
5 [报告]
发表于 2012-10-14 11:19 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2012-10-14 11:24 |只看该作者
按照你的帖子中的代码,我尝试了一下,结果为:
帖子中的代码和书中想要的结果一致。

应该是书中的代码在VC6.0中得不到书中的结果。
弄清楚就好呀,谢谢!

另外,char ch0 = 'E',ch1 = 'R', ch2 = 'R';
这三个字符代码中的定义顺序是ch0,ch1,ch2
在内存中的地址,从小到大是 ch2   ch1    ch0
这也是我最开始的疑问,可以在书中提一下哈哈,也是我们这些新手不知道的。
谢谢作者,我继续拜读。

回复 4# pmerofc


   

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
7 [报告]
发表于 2012-10-14 11:24 |只看该作者
这个本身是错误的编程, 导致内存溢出了, 结果正好是栈上的3个变量, 正好就溢出到后边2个字符了, 太正常了.

  1.        c      Matches  a sequence of characters whose length is specified by the maximum field width (default 1); the next pointer must be a pointer to
  2.               char, and there must be enough room for all the characters (no terminating null byte is added).  The usual skip of leading white space is
  3.               suppressed.  To skip white space first, use an explicit space in the format.
复制代码
看看scanf关于c的说法吧.

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
8 [报告]
发表于 2012-10-14 11:34 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
9 [报告]
发表于 2012-10-14 11:36 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
10 [报告]
发表于 2012-10-14 22:49 |只看该作者
Linux 下能顺利的得到书中的结果。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP