字符串格式化printf中“%%”的小坑

原创 2015年07月08日 09:28:05

昨天在整理一个模块的log输出,因为之前的输出太乱了,每当这个时候就不得不吐槽下老印的代码了,他们真的是在一个很强大的框架下完成很随意的实现啊,维护他们这80多万行的代码这段时间发现的奇葩错误不胜枚举,难怪当时老美听说我们一个小组7个人维护这个模块两年多时的感叹了...

言归正传,先来说说这个issue的表现,这段log输出是为了打压update process的进度值,从1% - 100%,在运行过程中发现到100%后后面会多一个“%”,成立“100%%”。检查了这段代码后发现了问题所在:由于这部分信息不是直接打印到屏幕的,而是先保存到一个string中,通过回调函数提供给应用层,因为要计算百分比从1%-99%都是使用string.format() / sprintf()完成的,而最后的100%为了保证没有小数直接使用string=“100%”这样的固定字符串。而问题的关键就在于最后的这个固定字符串,他们写成了string="100%%",为什么呢?应该是前面format()时候是“%f%%”的传染吧...

用一段代码来模拟说明,如下:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    const char *pStr = "Update : 100%%\n";

    printf("Size of pStr : %d...\n", strlen(pStr));
    printf("Print pStr   : %s...\n", pStr);

    printf("Direct Print : Update : 100%%\n...\n");

    return 0;
}

运行结果是什么样呢?我们来看看:

Size of pStr : 15...
Print pStr   : Update : 100%%
...
Direct Print : Update : 100%
...
可以看到,如果是在一个字符串中,'%'就是一个%,没有什么特殊含义,而如果是写在了printf的第一参数中,那就是转义符了;相对的'\'就没这么麻烦了,无论是在string中还是printf的第一参数都是转义符。

纠其原因,‘%’是字符串格式化函数定义的转义符,运行时生效,而‘\’是由编译器解释的,在数据段填写字符串时就转换了,你可以看到“strlen(pStr)”的结果是15而不是16。

(个人理解,没有资料支持,如有谬误,不吝赐教!)

字符格式化

一、用{0:?}格式化可通过 String.Format 方法或通过 Console.Write 方法格式化数值结果,其中后一种方法调用 String.Format。使用格式字符串指定格式。下表包含受...
  • hychieftain
  • hychieftain
  • 2004年11月30日 11:32
  • 1326

JAVA字符串格式化-String.format()的使用

常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象。熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处。format()方法有两种...
  • lonely_fireworks
  • lonely_fireworks
  • 2012年09月10日 11:01
  • 693802

printf 中转义字符大全

表一转换说明符及作为结果的打印输出 转换说明 输出 %a 浮点数、十六进制数字和p-记数法 (C99) %A ...
  • striver1205
  • striver1205
  • 2012年04月19日 15:49
  • 16109

C语言转义序列,printf双引号内的特殊转义字符

\n    换行  \r    回车键 \b   退后一格 \f    换页 \t    水平制表符 \v   垂直制表符 \a   发出鸣响 \? 插入问号 \"    插入双引号 ...
  • abc823758848
  • abc823758848
  • 2017年08月16日 18:03
  • 395

printf中语言转义字符和格式控制符的介绍

转义字符参考:/a:蜂鸣,响铃/b:回退:向后退一格/f:换页/n:换行,光标到下行行首/r:回车,光标到本行行首/t:水平制表/v:垂直制表//:反斜杠/’:单引号/”:双引号/?:问号/ddd:三...
  • neuprince
  • neuprince
  • 2010年05月28日 19:06
  • 3955

String.format的用法(字符串格式化)

String.format返回的是String类型的字符串 1.在string.xml里加入 绑定成员数量不能超过%d 2.java代码里就可以这样用 String.format(mRes.getSt...
  • wdy3110411073
  • wdy3110411073
  • 2015年12月30日 11:20
  • 2485

字符串和格式化输入/输出

字符串就是一个或多个字符的序列。双引号不是字符串的一部分,它们只是通知编译器其中包含了一个字符串。 C没有为字符串定义专门的变量类型,而是把它存储在char数组中。 字符串中的字符存放在相邻的存储单元...
  • Burgdan
  • Burgdan
  • 2016年08月27日 01:33
  • 719

Java字符串的格式化与输出

Java字符串的格式化与输出 在C语言中格式化输出可以通过printf()函数实现,在Java中无需借助第三方工具同样可以实现此功能,自Java SE5后,java也提供了C语言中printf()风格...
  • u012875880
  • u012875880
  • 2014年08月07日 16:55
  • 2161

转义字符的输出

转义字符在输出时前面要加上“\”,如: printf("\\t");  输出制表符“\t” printf("\\n"); 输出换行符"\n" printf("\\");   输出斜杠“\” 可...
  • jeffashan
  • jeffashan
  • 2014年12月01日 22:10
  • 1009

printf 中转义字符大全

表一转换说明符及作为结果的打印输出 转换说明 输出 %a 浮点数、十六进制数字和p-记数法 (C99) %A ...
  • whatday
  • whatday
  • 2014年05月09日 20:58
  • 808
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符串格式化printf中“%%”的小坑
举报原因:
原因补充:

(最多只允许输入30个字)