c - scanf() == 1 有什么用?
问题描述
我的代码:
while(scanf("%f", &number) && number > 0)
while(scanf("%f", &number) == 1 && number > 0)
这是什么,这== 1
是必要的吗?
解决方案
在这种情况下,scanf
, 将返回三个int
值之一。
EOF
:流结束或读取错误的负值,(如果要区分后一种情况,请参见ferror(stdin)
or!feof(stdin)
,并且在符合 POSIX 的系统上,errno
将被设置,)0
:匹配错误,和1
: 一个成功匹配的浮点数,存储在number
.
所以,
while(scanf("%f", &number) && number > 0)
while(scanf("%f", &number) == 1 && number > 0)
第一个
scanf("%f", &number) [!= 0] && ...
将返回 false on[0]
, true on[EOF, 1]
。On1
,在一个变量的情况下,它将按预期工作,但是 onEOF
,它沿着短路继续从未初始化的内存中读取;在下一次调用 时scanf
,它可能会挂起等待来自stdin
(很可能)关闭的输入。第二个
scanf("%f", &number) == 1 && ...
将返回 false on[EOF, 0]
, true on[1]
。这明确确认在继续下一条语句之前已写入变量。这更健壮,可以同时处理匹配和读取错误,并且可以正常工作,继续进行第二个谓词以检查它是否在域中。
但是,它没有记录循环停止的原因,后续读取可能会出现问题。要获取该信息,可以将一个变量分配给 的返回值scanf
。
推荐阅读
- google-apps-script - 如何获取电子表格绑定项目的脚本 ID?
- django - Django Rest Framework 模块未找到错误
- java - 物理命名策略已注册但在持久性时未触发
- oracle - 如何从 Oracle SQL Plus 执行 SQL,从 Unix 传递变量名 SQL 文件
- java - Android中的内存是如何释放的?
- jquery - 数据表期望数组,但被赋予对象(并且在期望对象时中断)
- javascript - 计算属性内的复杂 V-If?
- aws-lambda - 无服务器预热插件并发执行预热功能
- sql-server - 每组选择一列中的最小值
- python - 如何从销售订单、发票、采购订单、账单等的 PDF 报告的第二页中删除页眉和页脚。在 Odoo 12v 中