典型成语是:检查scanf(..)成功,而不使用字段数 - 有没有办法?
if (scanf("%d%d%d", &a, &b &c) != 3)
handle_the_failure();
这3
,场的数量,是多余的。如果我将模式和参数更改为scanf(..)
,但忘记更改3
,那是另一个编译 - 测试 - 调试周期,这是浪费时间。
有没有一种成语可以检查scanf(..)
的(绝对)成功,而无需在代码中写入字段数?也许是这样的:
scanf("%d%d%d", &a, &b &c);
if (lastScanfFailedInAnyWay())
handle_the_failure();
的documentation(见 “返回值” 一节)谈论四种不同的情况:
档案结尾
读取错误
配对失败
个编码错误解读宽字符
前两个是由feof(..)
和ferror(..)
(我假设feof(..)
意味着ferror(..)
),最后解决 - 通过设置errno
到EILSEQ
。但是我对一个全面的(即包括确定是否发生匹配失败)感兴趣。
P.S.看看上面这个完整的不在上下文中的例子,这看起来好像太多了,但是考虑一下真正的练习,在这里你可以快速做出很多变化,并且有数百个这样的小东西需要记住,每一次你改变了一件事,你必须改变另一件事。那么很明显,消除各种依赖关系的发展习惯是有益的。
不要假设['feof'](http://en.cppreference.com/w/c/io/feof)可能会在['ferror'](http:// en。 cppreference.com/w/c/io/ferror)会返回“false”,反之亦然。除非最后的函数调用实际上失败,并且指定实际设置'errno'(['scanf'和family](http://en.cppreference.com/w/c/io/) fscanf)不是)。如果一个在失败时设置'errno'的函数没有失败,那么'errno'的值是未指定的。 –
否;除了检查返回的数字是否是预期的数字外,没有一种可靠的方法可以确定'scanf()'家族例程是否工作。当你做出改变时你必须考虑。即使您进行了数百次更改,您也必须考虑每项更改,并确保您做出了正确的更改。欢迎来到编程世界 - 关注细节就是为什么你能得到好的收益。顺便提一下,如果你在设置了足够的警告选项的情况下使用GCC,你会被告知是否你不匹配格式字符串和其他参数,但它不会告诉你做出了错误的比较。 –
@JonathanLeffler我在等待那天能够欢迎你进入编程世界的日子,而你却因为好主意而获得报酬。 –