作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一个典型的成语是:
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
。但我对包罗万象感兴趣(即包括确定是否发生匹配失败)。
附言看看上面简洁的断章取义的例子,这似乎要求太多了,但考虑一下实际的实践,你会快速做出很多改变,并且有数百个这样的小事情要记住,每次你改变了一件事,你必须在别处改变另一件事。然后很明显,养成消除各种依赖性的习惯是有返回的。
最佳答案
你可以这样做:
bool wrap_the_scanf(char const *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
int result = vscanf(fmt, ap);
va_end(ap);
return result == count_specifiers(fmt);
}
其中 count_specifiers
是一个函数,它读取字符串以查看其中有多少 %
(将 %%
计为零)。
关于在不使用字段数的情况下检查 scanf(..) 是否成功——有办法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31981337/
我是一名优秀的程序员,十分优秀!