| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8198 人关注过本帖
标题:输入运算符Scanf的这种用法是什么意思?
只看楼主 加入收藏
孟晓文
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-8-6
结帖率:50%
收藏
已结贴  问题点数:15 回复次数:10 
输入运算符Scanf的这种用法是什么意思?
程序:
# include<stdio.h>
main()
{
    int a;
    char ch;
    scanf("%3d%3c",&a,&ch);
    printf("%d,%c",a,ch);
}
输入12345和abc
输出结果是:123,4
请问scanf("%3d%3c"……这是什么意思?
搜索更多相关主题的帖子: abc 
2011-10-09 00:45
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
发挥你的想象力,猜!
从字面信息就猜得出来。

授人以渔,不授人以鱼。
2011-10-09 00:47
孟晓文
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-8-6
收藏
得分:0 
回复 2楼 TonyDeng
大概猜出了一点,就是我这人语言组织能力差,思维慢一点,你能不能给我详细讲解一下,谢谢了。。。
2011-10-09 00:52
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:15 
你看,"%3d%3c",由于已经声明这是读入数据,每个%号代表一个单元,因此很明显是读两个数据。数字3从读取动作来看,应该就是读入数据的位数或个数、宽度。d,在英文中就是decimal的缩略符号,表明要读入一个3位整数。同样,"%3c"是读入3位character。

因此,信息是很明显的,读整数"%3d"时,最多读到3位,故你输入1234,它也只要123,留下的4,给下面的"%3c"读。但注意看数据类型,"%3c"的数据要给ch,而ch已被声明为char,它只接收1个字符,因此ch='4'。剩下的"5abc",留给接下来的scanf()读取。

授人以渔,不授人以鱼。
2011-10-09 01:01
孟晓文
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-8-6
收藏
得分:0 
回复 楼主 孟晓文
我是这样理解的,用十进制整数指定了输入的宽度,也就是3位,输入12345和abc
然后printf("%d,%c");
输出了前三位,也就是123
但后面有点理解不了,控制输入时也是3位字符型,但为什么输出会是整型 4 呢?
2011-10-09 01:01
孟晓文
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-8-6
收藏
得分:0 
回复 4楼 TonyDeng
谢谢,这下明白了,谢谢。。
2011-10-09 01:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
那个不是整型4,而是字符'4'。在输出设备打印字符'4'和数字4,看到的都一样,但本质不同。即不管什么数据,用打印机打出来,都是字符形态。

同样,从键盘读入的其实全部是字符"12345abc",但scanf()会根据格式字符串"%3d"的指定,将字符串"123"转换为整数再赋给变量a,而不是字符串。'4'才是原封不动地赋给变量ch,因为格式串指示那是字符。

现在,你理解scanf()和printf()使用格式字符串的原因了吗?如果没有这个东西,它会办错事的。


[ 本帖最后由 TonyDeng 于 2011-10-9 01:09 编辑 ]

授人以渔,不授人以鱼。
2011-10-09 01:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
这个例子还告诉你一个道理:scanf("%3d%3c"),它最多只处理键盘缓冲区中的6个字符,现在你输入了8个字符,它实际上只没收4个,还有4个留在缓冲区中,如果下一个scanf("%3d"),你猜它读到什么?作为程序员的你,应该怎样处理这种问题?编写程序时考虑到这种情况吗?你会轻信scanf()替你读入了正确的数据吗?想过要检验吗?这种检验是在写代码时进行还是程序实际运行时进行?

授人以渔,不授人以鱼。
2011-10-09 01:17
孟晓文
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2011-8-6
收藏
得分:0 
回复 8楼 TonyDeng
受教了,比我们老师讲的还详细,真的不知道该怎么感谢你,总之,谢谢你了,真希望可以拜你为师,呵呵,前提是你接受像我这么迂腐的脑袋。。呵呵,谢谢!
2011-10-09 01:33
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
不客气,从5楼看出你挺有悟性,不错的。

授人以渔,不授人以鱼。
2011-10-09 01:39
快速回复:输入运算符Scanf的这种用法是什么意思?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.089406 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved