如何避免sscanf函数使用%s占位符时消耗‘-’字符
sscanf 按
-分割字符串的解析方案 问题根因
sscanf 内置的%s占位符默认匹配所有非空白字符,而-不属于空白字符范围,因此会被%s完全捕获,直接读取到字符串末尾,导致后续的-分割规则失效。
解决方法
使用 sscanf 的否定扫描集语法%[^-]替代%s即可。该语法表示匹配所有除了-之外的字符,遇到-就会自动停止匹配,完全符合按-分割解析的需求。
修正后代码示例
$str = '-of-america-4'; // 将原规则中的 %s 替换为 %[^-] $pat = sscanf($str , "-%[^-]-%[^-]-%d"); print_r($pat); // 输出结果: // Array // ( // [0] => of // [1] => america // [2] => 4 // )
扩展说明
- 若需要支持多个分隔符,直接在
[^]中添加对应字符即可,例如需要同时按-和_分割,写法为%[^-_] - 若字符串中允许出现空片段,可以在扫描集后添加
*忽略空匹配,或者结合判断逻辑处理边界情况
内容的提问来源于stack exchange,提问作者solo
相关产品推荐
相关产品推荐

