工作中,总会发现不少同事(我也是)对于printf输出整型变量,该用%d,还是%u,或者%lu等等弄不清楚,基本都是清一色的%d输出了事。
比如要打印strlen接口返回的长度(size_t类型),该怎么打印呢?
当coverity静态代码检测后,这些滥用的格式输出就需要去进行整改。说到底可能还是对这个不够重视,觉得不会有什么影响,对这个没有过多的去关注了解。
在查看printf帮助手册的时候,对于常用的格式输出都有进行说明。对数据转换相关的分两类,一类是长度修饰符,一类是数据类型转换符。
常用的长度类型转换符有:hh、h、l、ll、L、z
其具体含义如下:
长度修饰符 | 说明 |
---|---|
hh | char 型数据 |
h | short 型数据 |
l | long 型数据 |
ll | long long 型数据 |
l | long double 型数据 |
z | size_t or ssize_t数据 |
常用的数据类型转换符有:d、o、u、x、X、c、s、p
其具体含义如下:
格式 | 类型 |
---|---|
%d | signed int (有符号十进制形式) |
%o | unsigned int (无符号八进制形式) |
%u | unsigned int (无符号十进制形式) |
%x | unsigned int (无符号十六进制小写形式) |
%X | unsigned int (无符号十六进制大写形式) |
%f | double |
%c | unisgned char |
%s | a string (需要注意\0结尾,否则访问越界) |
%p | void * pointer (一般用来打印地址,十六进制) |
数据类型转换符可以直接使用,而长度修饰符是一定要结合数据类型转换符使用的。比如%hhd对应signed char; %hhu对应unsigned char; %zu对应size_t; %zd对应ssize_t等。
像size_t在32位系统中是定义成 unsigned int; 而在64位系统中是定义成 long unsigned int,所以如果直接%u或者%lu,都存在移植兼容性问题,使用%zu就对应size_t类型。