printf()变长的格式化输出--通过参数控制

本文探讨了在处理变量长度格式化字符串时遇到的问题及解决方案,通过使用%%0%dd和%%-%ds等格式化指令,有效地实现了参数化输出,同时讨论了cppcheck警告的处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

缘起

  • 手上单子有个需求,处理%S7这样格式的模板,7表示长度,还是变量。
  • 这是20190108左右碰到的问题,20190131整理月度时,整理一下。

过程

第一步

  • 知道需求后,第一步就是用snprintf()去拼字符串了,可能没搜到合适的关键字,一开始没找到合适的方法。

    • 临时想了个解决方案:先用"%10d"取出10位来,然后用数组去接,循环到变量,这样实现是没问题的,但总觉得太土了,于是下班回家。

第二步

  • 回家琢磨不太对,又网上搜了一下,找到了一个帖子运用“%%-%ds"和"%%0%dd",实现输出格式参数化,一试解决了我的问题。
  • make后是没问题,第2天提交代码后cppcheck,出现了 warning: format not a string literal, argument types not checked。 这是字符串变量与字符串常量的问题

    • 解决方案是屏蔽到这种cppcheck,没找到合适的方案。

代码

  • 第一步的代码 暂时没找到,后面补上
  • 第二步的代码
char s[10] = {0};
char sValue[16] = {0};
snprintf(s,sizeof(s),"%%0%dd",iNum); // iNum是变量
snprintf(sValue, sizeof(sValue),  s, "业务代码值"); // s就相当于格式化输出

收获

  • 还是要搞懂需求,需求明确了,然后找方法(先实现,再优化)。
  • 上学的时候格式化输出没太管,印象中刷题的时候老会用到,有时会由于这种问题,导致不到100%。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值