C编程-格式输出

Posted by 周思进 on October 18, 2019

工作中,总会发现不少同事(我也是)对于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类型。