【发布时间】:2015-12-08 15:00:59
【问题描述】:
根据 sscanf() 的手册页,* 字符
可选的 '*' 赋值抑制字符:scanf() 读取输入 按照转换规范的指示,但丢弃输入。
据此,我(对吗?)假设像
sscanf(string,"%*[^|]%*c%[^|]%*c", vars)
将接受输入“text|neededtext|”,忽略第一个“|”之前的所有文本(即从标准输入中删除它?),忽略(并从标准输入中删除)下一个字符,即“|”存储“neededtext”,然后删除最后的“|”字符,让标准输入为空? 如果是,那么是否需要在此 sscanf() 调用之后运行清理函数,以捕获一些奇怪的异常以防万一出现问题,或者上面的代码是否总能保证工作?
我已经运行了一些测试,看起来 sscanf() 确实吃掉了标准输入中的所有字符,但我只是想确定一下。
【问题讨论】:
-
您的分析大部分是正确的,只是您查看的是从字符串读取的
sscanf(),而不是“stdin”!此外,sscanf()严格来说是非破坏性的;它不会改变其输入字符串。可能还有一个换行符。您应该测试来自sscanf()的返回值,以确保它获得了数据(如果之前没有管道,则返回 0)。不能直接判断后面的管道是否匹配。 -
啊,当然,谢谢!是的,当然 sscanf 从字符串中读取,而我使用的 fgets 将从标准输入中读取
-
确保您遵循@JonathanLeffler 的建议并检查来自
sscanf的回报。scanf和sscanf的错误处理基于成功匹配和分配的输入项的数量。您使用*丢弃输入允许在不增加匹配计数的情况下跳过输入。如果您不检查退货,则最初无法知道您是否真的拥有您认为拥有的东西...... -
谢谢,这正是我正在做的,检查输入并填充以适应格式,然后检查来自 sscanf 的返回值。谢谢你的建议。