免费注册 查看新帖 |

Chinaunix

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

scanf问题,请求帮助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-08 19:08 |只看该作者 |倒序浏览
这是什么问题:
请看如下代码:
#include <stdio.h>
#include <conio.h>

int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;char r[100],m;


&nbsp;&nbsp;&nbsp;&nbsp;scanf("%s%d", r, &m);
&nbsp;&nbsp;&nbsp;&nbsp;printf("%s,%d", r, m);


&nbsp;&nbsp;&nbsp;&nbsp;getch();
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}


输入与输出:
abc 123
,123
我想问一下为什么数组r中为什么没有值啊? (m的类型是char类型的)

论坛徽章:
0
2 [报告]
发表于 2008-11-08 19:14 |只看该作者
scanf("%s %d", r, &m);

论坛徽章:
0
3 [报告]
发表于 2008-11-08 19:43 |只看该作者
给你模拟一下执行时栈内的数据:

读入abc之后123之前:
高地址
| ....   |
| '\0'  |
|   c    |
|   b   |
|   a   | __ r
|____ |__ m
低地址

读入123之后:
高地址
| ....   |
| '\0'  |
|   0    |
|   0   |
|   0   | __ r
|123 |__ m
低地址
注意,此时先前读入的abc字符所在三个字节被读入的整数123(点四个字节)覆盖了,所以此时r相当于一个空串

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
4 [报告]
发表于 2008-11-08 21:23 |只看该作者

回复 #3 tyc611 的帖子

顶起来。有助于理解栈空间,字符型、整型数据

  1.     char r[100], m;

  2.     scanf("%s%d", r, &m);  //输入abcdefgh 123

  3.     r[10] = '\0';                   //

  4.     printf("%s,%d\n", r, m);  //,123

  5.     printf("%x %x %x %x\n", (int)r[0], (int)r[1], (int)r[2], (int)r[3]); //0 0 0 64(d)
  6.     printf("%s\n", r+4);  //efgh
复制代码

$ ./a.out
abcdefgh 123
,123
0 0 0 64
efgh

论坛徽章:
0
5 [报告]
发表于 2008-11-08 22:26 |只看该作者
原帖由 tyc611 于 2008-11-8 19:43 发表
给你模拟一下执行时栈内的数据:

读入abc之后123之前:
高地址
| ....   |
| '\0'  |
|   c    |
|   b   |
|   a   | __ r
|____ |__ m
低地址

读入123之后:
高地址
| ....   |
| '\0'  |
| ...

看不明白,为什么被覆盖了,怎么是用0覆盖?还有,怎么个覆盖啊。不是给m赋值成功了吗?

论坛徽章:
0
6 [报告]
发表于 2008-11-08 22:47 |只看该作者
原帖由 sunceenjoy 于 2008-11-8 22:26 发表

看不明白,为什么被覆盖了,怎么是用0覆盖?还有,怎么个覆盖啊。不是给m赋值成功了吗?

因为scanf中的%d把m当作一个int型变量(声明的却是一个char变量),因此会把读入的整数(123)存放在m所在地址开始的四个字节内(由于123用最低地址的一个字节就能保存,因此剩下高地址三个字节内容为0)

论坛徽章:
0
7 [报告]
发表于 2008-11-09 00:50 |只看该作者

回复 #5 sunceenjoy 的帖子

简单地说就是int在32位中系统中占4个字节,m是一个字节,数组r还占了3字节,具体看三楼的图
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP