我有下面的c代码
if (sscanf(input, "s %d\n", &value) == 1){}
在这里,它将解析以下内容
s -inf
....
s 0
s 1
s 2
....
s inf
但不是这样的事情
s 5junkjunkjunk
因为它不应该匹配,因为在
%d
和\n
之间有一些东西。尽管它不适合格式字符串,但它确实有效。 最佳答案
这就是为什么人们不应该使用*scanf
的原因之一:让它强大地处理格式错误的输入是非常困难的。
正确的解析方法是:使用fgets
(或者getline
读取整行,手动检查并跳过前导"s "
,然后使用strtod
解析数字,然后检查strtod
是否设置*endp
指向新行。
如果语法比你所掌握的还要复杂,那么可能是时候接触lex
和yacc
了。
关于c - sscanf格式字符串%d的显式匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22852059/