鱼C论坛

 找回密码
 立即注册
查看: 3088|回复: 1

【读入多组数据】

[复制链接]
发表于 2018-2-20 09:15:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请问这两者有区别吗,为什么前者也可以读入多组数据??

1)
while(~scanf("%d%d",&a,&b))
        ...
2)
while(scanf("%d%d",&a,&b) != EOF)
        ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-20 10:00:07 | 显示全部楼层
本帖最后由 xiaoxiaoshaonia 于 2018-2-20 10:05 编辑

while( ~scanf("%d %d", &a, &b) )
应当写成
while( scanf("%d %d", &a, &b) == 2 )
在ACM比赛时,选手知道不会出现非法或残缺的数据,所以为了节约时间,写成第一种格式


scanf 返回正确读入的字段数目,假如发生错误,返回 EOF
以 scanf("%d %d", &a, &b) 为例,它可能返回 EOF、0、1、2
如果发生了错误(比如无内容可读),返回EOF;
如果第一个%d格式就不对,返回0
如果第二个%d格式不对,返回1
如果第二个%d格式也对了,返回2
while( scanf("%d %d", &a, &b) == 2 ) 就是 a和b 都读成功了
GCC的EOF规定为-1,而-1在内存里以补码形式存放,为11111...111全为1,而~位取反则把它变成了000..0000全为0,也就是正数0。
因此-1位取反为0,用作逻辑判断,不过确实不太好用,(scanf .. == 2)更好。以下代码说明:
程序代码:
printf("EOF = %d , %d\n",EOF,~EOF);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-29 09:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表