如何避免printf输出含%的用户输入内容时出现乱码问题
最优雅的解决方案
无需对用户输入字符串做任何修改,直接将固定格式串设为%s,再把用户字符串作为参数传入printf即可:
std::string inputString = "% Test"; printf("%s", inputString.c_str());
运行后直接输出预期结果:% Test
方案原理
printf只会解析**第一个参数(格式控制串)**中的%为格式说明符,放在%s对应参数位置的字符串会被当做普通文本原样输出,完全不会触发格式符解析逻辑。
这个方案相比替换%为%%的方案优势非常明显:
- 不需要遍历修改原字符串,性能更高
- 没有修改用户输入的原始内容,逻辑更严谨
- 从根源避免了格式串注入的安全风险,是官方推荐的标准写法
特殊场景说明
如果你确实有需要将用户字符串作为格式控制串使用的场景(比如要支持用户输入的串里带合法的格式说明符),才需要做%到%%的自动替换,否则都优先用上述%s传参的方案即可。
内容的提问来源于stack exchange,提问作者Clamb
相关产品推荐
相关产品推荐

