数据的格式化输出是我们在编程过程中经常要做的事情,我们最常用的莫过于sprintf函数。当然还有sprintf衍生出来的一些函数,譬如安全的snprintf。还有一个需要提到的就是不属于C标准的itoa函数。
int sprintf ( char * str, const char * format, ... );
//成功返回写入str的字符个数,不包含结尾符,出错则返回负数
sprintf将可变参数(...)按照format格式化成字符串,写入到str中。
其中str指向空间的长度必须大于格式化的字符串的长度,否则有可能会发生内存越界问题。格式化后的字符串写入str后,会自动在字符串结尾加上结束符。
format参数是标识字符串格式化方式,和printf函数的format参数是一样的,下面温习一下,format格式的组合方式如下:
%[flags][width][.precision][length]specifier
flags部分取值如下:
width部分表示数据的需要格式的宽度:
width部分可以用’*’表示,然后再在printf函数后面的参数列表中表示’*’所指的长度,如下所示:
printf("%0*x", 8, 12345);//实参列表中的8就表示format中’*’字段所要格式长度
//执行结果如下:
00003039
.precision部分表示数据的需要格式的精度:
specifier部分最重要也是不可缺少的一部分,表示用于以何种方式对数据进行解析。具体内容如下:
说了这么多就是我在项目中遇到一个需求就是:将一个整数格式化成一个二进制表示的字符串,而sprintf函数偏偏无法将一个整数格式化成二进制表示的字符串。我们也许会想到还有一个itoa系列的函数可以使用,用法如下:
char * itoa ( int value, char * str, int base );
//返回值等于str
value表示要转换的整数;
str用于存储准换后的字符串;对str所指向空间大小的要求是:16位系统最大需要17字节,32位的系统最大需要33个字节。因为base可以最低取2.
base表示要转换成某种进制的基数标识,base可以取值2-36之间的值,比如2,8,10,16分别表示2进制,8进制,10进制,16进制。
如果base取值为10且value为一个负数,那么转换后的字符串前面会含有’-’号,其他base下,都认为是无符号整数。
由上面可以知道itoa函数可以完成将一个整数格式化成一个二进制表示的字符串的需求。但是我们应该明白的是itoa函数不属于C标准,很巧合的是Linux下gcc也不支持该函数。所以我们需要在Linux下面自己来编写将一个整数转换成二进制字符串的函数。如下代码:
int itoa_bin(unsigned int data, char *str)
{
if(str == NULL)
return -1;
char *start = str;
while(data)
{
if(data & 0x1)
*str++ = 0x31;
else
*str++ = 0x30;
data >>= 1;
}
*str = 0;
//reverse the order
char *low, *high, temp;
low = start, high = str - 1;
while(low < high)
{
temp = *low;
*low = *high;
*high = temp;
++low;
--high;
}
return 0;
}
Create Time:Dec. 1, 2013 Last Modified Date:Dec. 1, 2013