| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1826 人关注过本帖
标题:scanf 的匹配原则不同的编译器不一样?
只看楼主 加入收藏
飞跃贫民窟
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2014-7-25
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:20 
scanf 的匹配原则不同的编译器不一样?
程序代码:
#include <stdio.h>
int main(void)
{
    char ch1 = 'a';
    char ch2 = 'b';

    scanf("%c,%c", &ch1, &ch2);

    printf("%c, %c\n", ch1, ch2);
    return 0;
}

同一段程序在2012和6.0里面结果不一样,在6.0里能正常运行,但是到2012就不行了,一运行就出错(scanf已经改成scanf_s)
我的想法是,在6.0中,从键盘输入了 p,e 然后这三个字符存放在键盘输入缓冲区中,第一个控制符%c匹配了'p',格式控制字符串中的','匹配键盘输入缓存区的','第二个控制符%c匹配了'e'
我想请问,结束输入是因为缓存区中没有字符了还是因为最后敲了回车键?
还有就是为什么在2012中总是出错?是跟第三个边界检测的参数有关吗?
搜索更多相关主题的帖子: 编译器 
2014-07-25 11:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
是的,正跟第三个参数有关。对字符型数据输入,必须在那个参数中指定接收字符的个数。你要接收1个字符%c,那么那个参数就是1,依此类推,%2c是2……。这是防溢出攻击的。

授人以渔,不授人以鱼。
2014-07-25 11:45
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
相关帮助:

图片附件: 游客没有浏览图片的权限,请 登录注册

授人以渔,不授人以鱼。
2014-07-25 12:05
飞跃贫民窟
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2014-7-25
收藏
得分:0 
回复 2 楼 TonyDeng
问了scanf的问题居然没被版主骂,哈哈
我尝试加了第三个参数,可是运行依然出错,这是为什么呢?scanf这个函数对字符的读取真是好麻烦啊
图片附件: 游客没有浏览图片的权限,请 登录注册
2014-07-25 13:35
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:0 
scanf和scanf_s是两个不同的函数,scanf_s是微软对scanf的加强.  

楼主不能得到正确输出的原因是因为用了中文的逗号",",尽管在命令行状态下可以输入",",可是","是占用两个字符的,因此,scanf并没有正确的执行.

作为测试,加入变量a,然后打印出来,你可以发现scanf函数返回的是1, 而如果正确执行的话,应该返回2.

程序代码:
#include <stdio.h>
int main(void)
{
    char ch1 = 'a';
    char ch2 = 'b';
    int a;

    a=scanf("%c,%c", &ch1, &ch2);      //注意这里, 两个%c之间,你的是",",改成","就可以正确执行了.

    printf("%c, %c,%d\n", ch1, ch2,a);
    return 0;
}

代码测试环境:  WinXP+C-Free5.0.
2014-07-25 13:53
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:3 
推荐一个TonyDeng版主在一个主题中关于scanf函数用法的帖子(T版对这个函数的回帖太多,我只是挑了一个我正好回复过的):
https://bbs.bccn.net/viewthread.php?tid=433433&extra=&page=1

尤其注意31楼.

代码测试环境:  WinXP+C-Free5.0.
2014-07-25 14:01
飞跃贫民窟
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2014-7-25
收藏
得分:0 
回复 5 楼 vvvcuu
真不是使用中文逗号还是英文逗号的原因,我试了不用逗号,还是错误
2014-07-25 14:04
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:0 
回复 7 楼 飞跃贫民窟
那你试没试各种情况下scanf究竟返回了什么?

---------------------------------我叫分割线--------------------------------
各种情况下的运行结果:
无符号:
图片附件: 游客没有浏览图片的权限,请 登录注册

中文逗号:
图片附件: 游客没有浏览图片的权限,请 登录注册

英文逗号:
图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 vvvcuu 于 2014-7-25 14:30 编辑 ]

代码测试环境:  WinXP+C-Free5.0.
2014-07-25 14:22
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:7 
以下是引用飞跃贫民窟在2014-7-25 14:04:15的发言:

真不是使用中文逗号还是英文逗号的原因,我试了不用逗号,还是错误



同样的代码  我在vs2010下测试无任何编译和运行问题

DO IT YOURSELF !
2014-07-25 14:23
飞跃贫民窟
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2014-7-25
收藏
得分:0 
回复 9 楼 wp231957
我在6.0试了一下,也没问题,可能真的是我的软件有问题
2014-07-25 14:53
快速回复:scanf 的匹配原则不同的编译器不一样?
数据加载中...
 
   



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

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