【问题标题】:variadic scanf in CC中的可变参数scanf
【发布时间】:2011-08-03 05:43:31
【问题描述】:

我很好奇是否有可能在 C 中实现 scanf 的一种可变参数版本。我的意思是,如果输入是 push (1 2 3)scanf 将能够用某些东西将其解析为 %s %d %d %d喜欢scanf("%s (%d)", string, some_list)

它将获取%d 的所有实例并将它们(按顺序)附加到列表中...

我说的有道理吗?

编辑:对于指定的输入,string == "push"some_list == [1, 2, 3]

【问题讨论】:

    标签: c parsing list scanf variadic-functions


    【解决方案1】:

    vscanf, vssscanf, vsfcanf 不是您要找的吗?它们从 C99 开始可用。

    这里是vscanf函数的描述和使用示例。请注意,C 是一种已编译的强类型语言,您需要正确指定格式说明符。做一些高级语言所做的事情会涉及更多的工作(但这是可能的,因为功能又是用 C 编写的)。

    【讨论】:

    • 我似乎无法弄清楚vscanf 的工作原理,以及它是否适合我的目的。不管有多少ints,它会读取并将它们放入指定的数组中吗?
    • 用一个用法示例更新了答案。
    • 该示例与常规 scanf 有何不同?
    • 我需要扫描可变数量的整数并将其转换为数组:-/
    • 是的,我明白了。也许您应该查看执行此操作的高级语言的源代码(使用 C 中的底层实现),将所有内容视为 void * ptr 并将这些引用存储在数组中。
    【解决方案2】:

    当然。你可以实现一个像这样工作的 scanf 版本。

    它不是 C 库的一部分的原因是它需要没有内置到库中的数据结构。类似于链表或可调整大小的数组。

    但无论如何,您可以创建一个 scanf 函数来接受高级形式的模式。它可能看起来像super_scanf("%{s:allocate} (%{d*:array,append)", &string, &array)

    但通常,您要么编写自己的分词器和简单的解析器,要么升级到像 lex/yacc 这样强大的东西。或者您可以使用 PCRE 库之类的正则表达式库。

    【讨论】:

    • 对简单的解析器/标记器有什么建议吗?我用 C 编写了一个简单的基于堆栈的机器语言,并正在考虑使用多个参数命令对其进行扩展。目前我只是没有能力接受可变数量的论点。
    • 数组不必调整大小;它可能有一个上限,然后是空值......
    猜你喜欢
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    相关资源
    最近更新 更多