0

很抱歉以如此一般的信息请求打扰 SO。

我可以找到很多非常术语繁重的 vscanf 定义——但是除了 IBM 信息中心网站上的这个相当不错的例子之外,我找不到太多具体的例子来展示函数返回的内容:

http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Frtref%2Fvscanf.htm

但是,此示例仅适用于单行字符串输入,而我正在尝试做同样的事情,但是从具有多行的 .txt 文件中读取。

我是否必须使用 fgets() 一次读取一行然后使用 vscanf?我是否必须在函数中使用它,就像 IBM 信息中心示例所做的那样,将它放在函数 vread() 中?

我是 CS 一年级的学生,但这不是作业的问题,我只是想做一些额外的工作并扩展我的知识,我们还没有到 vread/vscanf。

我应该坚持使用 sscanf 吗?如果这太愚蠢了,我很抱歉。

PS 我喜欢学习 C。我在这个星球上的 31 年中作为一名学生获得了最大的乐趣,除了我曾经和一些来自 RSC 的人一起参加莎士比亚研讨会。

4

2 回答 2

2

vscanf 类似于 scanf,而不是 sscanf 或 fscanf。它与 scanf 的不同之处在于 scanf 采用可变数量的参数,而 vscanf 采用 va_list 参数,该参数充当指向可变参数列表的指针。vscanf 的使用很少;它主要是为了完整性(使用 vprintf 更常见)。使用 vscanf 的一个可能示例是,如果您有大量具有不同参数的 scanf 调用,并且每次它都会采取一些错误操作 - 相同的错误操作 - 如果 scanf 无法读取其所有参数。然后,您可以编写一个 scanf_and_check_for_error 函数,该函数像 scanf 一样接受可变参数,并添加一个 count 参数,它是 scanf 的预期返回值,将参数列表传递给 vscanf,检查其返回值并在以下情况下采取错误操作返回值是错误的。例如,

void scanf_and_check(int count, char *fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    int rc = vscanf(fmt, ap);
    if (rc != count)
    {
        ErrorMessageBox("Bad input. This program employs a radical form of the fail-fast principle ... exiting!");
        exit(1);
    }
    va_end(ap);
}
于 2013-06-10T06:31:29.923 回答
0

我怀疑你可能尝试了错误的工具来完成这项工作。vscanf 旨在在开发 scanf 系列的“前端”时使用,并且是一个非常“低级”的工具。

您可能想使用 fscanf。如果您真的想使用 vscanf 逻辑(及其所有 va_list 丑陋),请查看 vfscanf (在您的示例中链接)

于 2013-06-10T05:35:28.693 回答