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

Bug制造机
• 阅读 2357

缘起

  • 手上单子有个需求,处理%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%。
点赞
收藏
评论区
推荐文章
Ustinain Ustinain
4年前
C语言_格式化输入输出
C语言_格式化输入输出我们知道在最开始输入输出的printf和scanf里可以用百分号跟上一个字母d说明要整数的类型,%f说明要以浮点数输出printf()%flagswidth.prechlLty
go语言中,Printf()、Sprintf()、Fprintf()函数的区别用法是什么?
Printf()、Sprintf()、Fprintf()函数的区别用法是什么?  都是输出格式化字符串,只是输出到的目标不一样:    Printf()是把格式化字符串输出到标准到标准输出(一般是屏幕,可以重定向)    Printf()是和标准输出文件(stdout)关联的,Fprintf则没有这个限制    Sprintf()是
虾米大王 虾米大王
3年前
java代码012
code012.jspInserttitlehere<%JSP内置对象1.request用于处理HTTP请求中的各项参数。如,删除可以通过request对象的getParameter()方法获取如,request.getParameter("id")在请求转发时,需要把一些数据传递到转发后的页面处理。就需要用到request的se
Wesley13 Wesley13
3年前
(绝对有用)iOS获取UUID,并使用keychain存储
UDID被弃用,使用UUID来作为设备的唯一标识。获取到UUID后,如果用NSUserDefaults存储,当程序被卸载后重装时,再获得的UUID和之前就不同了。使用keychain存储可以保证程序卸载重装时,UUID不变。但当刷机或者升级系统后,UUID还是会改变的。但这仍是目前为止最佳的解决办法了,如果有更好的解决办法,欢迎留言。(我整理的解决办法的参
Stella981 Stella981
3年前
Python time模块 返回格式化时间
常用命令  strftimetime.strftime("%Y%m%d%H:%M:%S",formattime)第二个参数为可选参数,不填第二个参数则返回格式化后的当前时间日期201812112:00:00time.strftime('%H:%M:%S')返回当前时间的时分秒time.strftim
Wesley13 Wesley13
3年前
Oracle一张表中实现对一个字段不同值和总值的统计(多个count)
需求:统计WAIT\_ORDER表中的工单总数、未处理工单总数、已完成工单总数、未完成工单总数。表结构:为了举例子方便,WAIT\_ORDER表只有两个字段,分别是ID、STATUS,其中STATUS为工单的状态。1表示未处理,2表示已完成,3表示未完成总数。 SQL:  1.SELECT   2
Wesley13 Wesley13
3年前
Java日期时间API系列30
  实际使用中,经常需要使用不同精确度的Date,比如保留到天2020042300:00:00,保留到小时,保留到分钟,保留到秒等,常见的方法是通过格式化到指定精确度(比如:yyyyMMdd),然后再解析为Date。Java8中可以用更多的方法来实现这个需求,下面使用三种方法:使用Format方法、 使用Of方法和使用With方法,性能对比,使用
Stella981 Stella981
3年前
Gson之实例五
前面四篇博客基本上可以满足我们处理的绝大多数需求,但有时项目中对json有特殊的格式规定.比如下面的json串解析:{"tableName":"students","tableData":{"id":1,"name":"李坤","birthDay":"Jun 22, 2012 9:54:49 PM"},{"id":2,"name":"曹贵生"
Stella981 Stella981
3年前
Ecshop购物车Ajax数量添加减少
修改文件:1\.flow.dwt模板, 2\.flow.php 首先第一步:修改购物车模板:添加数量减少/增加按钮(这里用的span),input文本框按照下边参数设置好。<divclass"zzfl"<spanonclick"red_num({$goods.rec_id},{$good
Stella981 Stella981
3年前
Kafka相关内容总结(概念和原理)
说明主要内容是在网上的一些文章中整理出来;加粗的字体是比较重要的内容,部分是自己的经验和理解;整理的目的主要是为了方便查阅;为什么需要消息系统解耦:在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。消息队列在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实
Python进阶者 Python进阶者
1年前
盘点一个Python字符串格式化处理的问题(AI+Python)
大家好,我是Python进阶者。一、前言前几天在Python白银交流群【空翼】问了一个字符串格式化处理的问题,问题如下:二、实现过程这里【东哥】给了一个指导,如下所示:word:<10:这是一个格式化字段,word是变量名,<10是格式化选项。这里<表示左