字符串格式化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。

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

相关文章推荐

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

String.format返回的是String类型的字符串 1.在string.xml里加入 绑定成员数量不能超过%d 2.java代码里就可以这样用 String.format(mRes.getSt...

字符串格式化符号含义及转义字符含义

字符串格式化符号含义       符   号    说     明      %c    格式化字符及其ASCII码      %s    格式化字符串 ...

c语言中的格式化字符串

C语言中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型, 其中方括号[]中的项为可选项。 一、类型 我们用一定的字符用以表示输出数据的类型,其格式符和意义下表所示:...

批处理特殊符号 通配符与转义符

常用特殊符号 1、@命令行回显屏蔽符 2、%批处理变量引导符 3、> 重定向符 4、>>重定向符 5、、 6、|命令管道符 7、^转义字符 8、组合命令 9、& 组合命令 ...
  • bytxl
  • bytxl
  • 2015年12月11日 15:51
  • 9232

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

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

格式化字符串漏洞利用 二、格式化函数

二、格式化函数格式化函数是一类特殊的 ANSI C 函数,接受可变数量的参数,其中的一个就是所谓的格式化字符串。当函数求解格式化字符串时,它会访问向函数提供的额外参数。它是一个转换函数,用于将原始的 ...

printf 中转义字符大全

表一转换说明符及作为结果的打印输出 转换说明 输出 %a 浮点数、十六进制数字和p-记数法 (C99) %A ...

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

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

转义字符的输出

转义字符在输出时前面要加上“\”,如: printf("\\t");  输出制表符“\t” printf("\\n"); 输出换行符"\n" printf("\\");   输出斜杠“\” 可...

学习笔记——ARM Cortex-M0 异常与中断

异常类型及编号 异常优先级 向量表 EXC_TURN值 异常流程 3种主要的异常及其机制...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符串格式化printf中“%%”的小坑
举报原因:
原因补充:

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