gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:32:09 26 4
gpt4 key购买 nike

一个典型的成语是:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com