我很好奇是否有可能在c中实现scanf
的一种可变版本。我的意思是,如果输入是push (1 2 3)
, scanf
将能够将其解析为%s %d %d %d
,如scanf("%s (%d)", string, some_list)
。
它将获取%d
的所有实例并将它们(按顺序)附加到列表中…
我说的有道理吗?
EDIT:对于指定的输入,string == "push"
和some_list == [1, 2, 3]
.
不是vscanf, vssscanf, vsscanf是你正在寻找什么?从1999年起可以买到。
下面是vscanf函数的描述和使用示例。注意,C是一种编译的强类型语言,您需要正确地给出格式说明符。做一些类似于高级语言所做的事情将涉及更多的工作(但这是可能的,因为功能返回用C编写)。
当然。你可以实现这样一个scanf版本:
不属于C库的原因是它需要的数据结构不是内置在库中。比如一个链表,或者一个可调整大小的数组。
但是无论如何,您可以创建一个接受高级模式形式的scanf函数。可以写成super_scanf("%{s:allocate} (%{d*:array,append)", &string, &array)
但通常情况下,您要么编写自己的标记器和简单解析器,要么使用lex/yacc等功能强大的工具。或者您可以使用正则表达式库,如PCRE库。