You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何fscanf格式串中[0-9A-Z^%]后不应加s或c类型说明符?

为什么fscanf格式串中s的位置会影响字段读取?

这问题其实是把%[^...]格式说明符和s的关系搞混啦,咱们一步步拆解你遇到的三种情况:

第一种情况:格式串%d:%d:%[^:]s:%[^\n]

这里的%[^:]是一个完整的格式说明符,它的作用是读取所有不是:的字符,直到碰到:为止。而后面跟着的s不是格式说明符的一部分,它是一个普通的字面量字符——意思是fscanf在读完第三个字段后,会尝试在输入里找一个s字符来匹配,但你的输入里第三个字段Abridge后面是:,根本没有s,匹配失败后fscanf直接停止后续的读取操作,所以最后一个字段完全读不到,就出现了4:0:Abridge::的结果。

第二种情况:格式串%d:%d:%[^:]:%[^\n]s

这个格式串里,%[^:]正常读取完第三个字段Abridge,接着格式串里的:和输入里的:匹配成功,然后%[^\n]会读取所有直到换行的字符(也就是To condense:)。后面的s虽然还是字面量,但这时候输入已经到换行结束了,不过因为前面的目标字段都已经读取完成,所以这个多余的s不会影响最终结果,所有字段都能正常读到。

第三种情况:格式串%d:%d:%[^:]:%[^\n]

这是最标准的正确用法:%[^:]读取第三个字段,格式串里的:匹配输入中的分隔符,%[^\n]读取最后一个字段直到换行,全程没有多余的字面量干扰,所以所有字段都能被正常读取,输出自然正确。

核心知识点

要记住:%[^...]本身就是一个独立的字符读取格式说明符,它的功能是读取指定字符集之外的所有字符,不需要额外加s。如果在%[^...]后面加s,这个s会被当成需要匹配的普通字符,而不是格式说明的一部分——这就是导致第一种情况读取失败的根本原因。

内容的提问来源于stack exchange,提问作者STG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:13:33