在不使用字段数的情况下检查 scanf(..) 是否成功——有办法吗?

标签 c 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 (参见“返回值”部分)讨论了四种不同的条件:

  1. 文件结束

  2. 读取错误

  3. 匹配失败

  4. 解释宽字符编码错误

前两个由 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/

相关文章:

c - 有没有办法知道 fscanf 何时读取空格或新行?

c - stdin 的 fscanf 不提示输入

c - 在c中读取一个字符和一个数字

c++ - 对自定义 C++ 库的 undefined reference

java - 大 uint64_t 从 C 到 Java 的模除法

c - 使用 pthread_kill() 有危险吗?

c - 为什么此函数中使用 Char 数据类型?

c - 如何在C中搜索文件中的单词,将其放入数组中然后将其删除

c - 如何计算c中由许多单词组成的行或字符串的大小?

C 顶点数组错误值