您的位置:首页 > 运维架构 > Linux

分享一个函数,linux内核0.11代码Vsprintf中的一个函数

2011-10-31 14:26 351 查看
// 将整数转换为指定进制的字符串。

// 输入:num-整数;base-进制;size-字符串长度;precision-数字长度(精度);type-类型选项。

// 输出:str 字符串指针。

static char * number(char * str, int num, int base, int size, int precision

,int type)

{

char c,sign,tmp[36];

const char *digits= "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

int i;

// 如果类型type 指出用小写字母,则定义小写字母集。

// 如果类型指出要左调整(靠左边界),则屏蔽类型中的填零标志。

// 如果进制基数小于2 或大于36,则退出处理,也即本程序只能处理基数在2-32 之间的数。

if (type&SMALL) digits= "0123456789abcdefghijklmnopqrstuvwxyz";

if (type&LEFT) type &= ~ZEROPAD; //#define ZEROPAD 1 填充0标志

if (base<2 || base>36)

return 0;

// 如果类型指出要填零,则置字符变量c='0'(也即''),否则c 等于空格字符。

// 如果类型指出是带符号数并且数值num 小于0,则置符号变量sign=负号,并使num 取绝对值。

// 否则如果类型指出是加号,则置sign=加号,否则若类型带空格标志则sign=空格,否则置0。

c = (type & ZEROPAD) ? '' : ' ' ;

if (type&SIGN && num<0) {

sign= '-';

num = -num;

} else

sign=(type&PLUS) ? '+' : ((type&SPACE) ? ' ' : 0);

// 若带符号,则宽度值减1。若类型指出是特殊转换,则对于十六进制宽度再减少2 位(用于0x),

// 对于八进制宽度减1(用于八进制转换结果前放一个零)。

if (sign) size--;

if (type&SPECIAL)

if (base==16) size -= 2;

else if (base==8) size--;

// 如果数值num 为0,则临时字符串='0';否则根据给定的基数将数值num 转换成字符形式。

i=0;

if (num==0)

tmp[i++]= '';

else while (num!=0)

tmp[i++]=digits[do_div(num,base)];

// 若数值字符个数大于精度值,则精度值扩展为数字个数值。

// 宽度值size 减去用于存放数值字符的个数。

if (i>precision) precision=i;

size -= precision;

// 从这里真正开始形成所需要的转换结果,并暂时放在字符串str 中。

// 若类型中没有填零(ZEROPAD)和左靠齐(左调整)标志,则在str 中首先

// 填放剩余宽度值指出的空格数。若需带符号位,则存入符号。

if (!(type&(ZEROPAD+LEFT)))

while(size-->0)

*str++ = ' ';

if (sign)

*str++ = sign;

// 若类型指出是特殊转换,则对于八进制转换结果头一位放置一个'0';而对于十六进制则存放'0x'。

if (type&SPECIAL)

if (base==8)

*str++ = '';

else if (base==16) {

*str++ = '';

*str++ = digits[33]; // 'X'或'x'

}

// 若类型中没有左调整(左靠齐)标志,则在剩余宽度中存放c 字符('0'或空格),见51 行。

if (!(type&LEFT))

while(size-->0)

*str++ = c;

// 此时i 存有数值num 的数字个数。若数字个数小于精度值,则str 中放入(精度值-i)个'0'。

while(i<precision--)

*str++ = '';

// 将转数值换好的数字字符填入str 中。共i 个。

while(i-->0)

*str++ = tmp[i];

// 若宽度值仍大于零,则表示类型标志中有左靠齐标志标志。则在剩余宽度中放入空格。

while(size-->0)

*str++ = ' ';

return str; // 返回转换好的字符串。

}

以前上学的时候实现过转换成2进制,8进制,16进制的函数,看到这个函数才知道原来可以做的这个强悍。分享一个……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: