| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2926 人关注过本帖
标题:scanf函数工作的原理。。。
只看楼主 加入收藏
暴强大叔
Rank: 2
等 级:论坛游民
帖 子:15
专家分:15
注 册:2013-4-9
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:10 
scanf函数工作的原理。。。
图片附件: 游客没有浏览图片的权限,请 登录注册



#include<stdio.h>               
#include<conio.h>
void main(void)
{
    char m,t;
    int n;
    printf("please input m:\n");        //当程序运行到这一步时,我输入的数据是mn7k,目的就是看scanf匹配完m后,对于n及t的匹配是怎样的·结果如图,
    scanf("%c",&m);                      //图中m和n间的那个-858993460怎么解释啊,由于我的二进制补码原码学的不是很好,表示不能理解,望大神支招。。
    printf("please input n:\n");
    scanf("%d",n);
    printf("please input t:\n");
    scanf("%C",&t);
    printf("%c%d%c\n",m,n,t);
    getch();
}
搜索更多相关主题的帖子: void include please 二进制 
2013-04-13 17:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
补你个头码,看清楚第二个scanf()写了什么!

授人以渔,不授人以鱼。
2013-04-13 17:10
暴强大叔
Rank: 2
等 级:论坛游民
帖 子:15
专家分:15
注 册:2013-4-9
收藏
得分:0 
回复 2楼 TonyDeng
哦,大意了,谢谢大神的指点,请问大神编译了吗?我从新编了,结果没变啊。。。又多了个问题,为啥改了&之后结果没变?
2013-04-13 17:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
定义了什么数据类型、读入了什么数据类型、输出什么数据类型,自己检查清楚!

授人以渔,不授人以鱼。
2013-04-13 17:38
yctchxf
Rank: 6Rank: 6
来 自:盐城
等 级:侠之大者
威 望:2
帖 子:176
专家分:454
注 册:2012-4-10
收藏
得分:0 
回复 4楼 TonyDeng
版主火气够大啊…… 消消气……
2013-04-13 18:15
暴强大叔
Rank: 2
等 级:论坛游民
帖 子:15
专家分:15
注 册:2013-4-9
收藏
得分:0 
回复 4楼 TonyDeng
请问您有好好看看我的代码吗?我输入mn7k就是要看scanf函数的“匹配模式”是如何运行的,正常的流程我知道,我现在要讨论的是scanf在读入键盘缓存时的匹配原则,第一步是匹配字符型变量m,对应的是字符”m“,第二步是整型变量n,结果对应的是字符"n",我想知道此时的scanf如何匹配的,以及-8。。。。这个数是怎么来的?还有最后的字符变量t被赋给了n,说明了scanf对于第二步的字符”n”处理应该是返回键盘的,可是那个-8。。。。这个数从何而来???可能这里我表达的不够清楚,望见谅。。。
2013-04-13 18:26
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
版主说的没错呀?
怎么没好好看你的代码?

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-04-13 18:37
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
早在2楼就提醒你注意自己写了什么,你自以为是改了语法问题就可以,那是你的事,再提醒还悟不过来,这样学习的意气是没救的。你第二个scanf(),试图读入一个整数,但它此时遇到的是字符'n',这个字符scanf()无法解析成整数,就把这个地址处的数据胡乱解析为一个整数(极可能此时高位为1就出负数)灌给变量n,这就是你运行的结果。你的程序需要整数,但用户输入了不是整数的东西,这是scanf()无法控制的东西,出错是一定的,你写程序要自己考虑用户可能不按要求输入的问题,C把这种麻烦踢给程序员。

授人以渔,不授人以鱼。
2013-04-13 18:38
a535182324
Rank: 2
等 级:论坛游民
帖 子:21
专家分:35
注 册:2013-3-5
收藏
得分:10 
这个程序本身是有问题,但晓得楼主是为了进行程序的测试!
整了老半天,发现这段程序的错误真正所在了!!
char m,t;
    int n;
    printf("please input m:\n");        //当程序运行到这一步时,我输入的数据是mn7k,目的就是看scanf匹配完m后,对于n及t的匹配是怎样的·结果如图,
    scanf("%c",&m);                      //图中m和n间的那个-858993460怎么解释啊,由于我的二进制补码原码学的不是很好,表示不能理解,望大神支招。。
    scanf("%d",n);
    scanf("%C",&t);

现象是:这段程序的第三个scanf语句为执行(这正是问题所在)
scanf语句的参数配置相当的严格,
在从缓冲区进行读取数据是与参数进行匹配,如果类型符合,则进行继续进行以上操作,直到匹配完所有的参数,如果其中有一个参数不匹配,那就从这个地方跳出,忽略这个scanf 后面所有的参数,而去执行下一条语句。

这里输入mn7k,m首先与第一个scanf的参数%c匹配成功,m成功赋值
              n与第二个scanf的参数%d匹配,不符合,则跳过该语句
              n与第三个scanf的参数%c匹配成功,t被成功赋值
              7k被自动过滤
              程序结束
由于参数n未进行初始化,但是仍然进行了输出,所以输出了其所在的地址(不太确定)
              

所以在进行运用scanf的时候一定要注意类型匹配,同时为了能够保证输入数据的正确性,也可以用相关的函数进行控制
具体的你参照(scanf错误)里面的写就行!
2013-04-13 20:03
暴强大叔
Rank: 2
等 级:论坛游民
帖 子:15
专家分:15
注 册:2013-4-9
收藏
得分:0 
回复 8楼 TonyDeng
您可能还没理解我的意思,我输入错误的数据就是为了测试程序的啊,您现在说的就是我想要的解释啊,麻烦了。。。
2013-04-14 21:10
快速回复:scanf函数工作的原理。。。
数据加载中...
 
   



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

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