我有下面的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指向新行。
如果语法比你所掌握的还要复杂,那么可能是时候接触lexyacc了。

关于c - sscanf格式字符串%d的显式匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22852059/

10-11 21:03
查看更多