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

// 将整数转换为指定进制的字符串。

// 输入: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(i0) *str++ = tmp[i]; // 若宽度值仍大于零,则表示类型标志中有左靠齐标志标志。则在剩余宽度中放入空格。 while(size-->0) *str++ = ' '; return str; // 返回转换好的字符串。 }  以前上学的时候实现过转换成2进制,8进制,16进制的函数,看到这个函数才知道原来可以做的这个强悍。分享一个……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值