当前位置: 技术问答>linux和unix
请高手讲解代码 高手进
来源: 互联网 发布时间:2016-03-12
本文导语: 不知道下面两个函数的作用 char *do_printf(char *buf,char *fmt,va_list args) { register char *p; char tmp[16]; while (*fmt) { if (*fmt == 'n') *(buf++) = 'r'; if (*fmt == '%') { /* switch() uses more spa...
不知道下面两个函数的作用
char *do_printf(char *buf,char *fmt,va_list args)
{
register char *p;
char tmp[16];
while (*fmt) {
if (*fmt == 'n')
*(buf++) = 'r';
if (*fmt == '%') { /* switch() uses more space */
fmt++;
if (*fmt == 'X') {
register long h = va_arg(args,long);
*(buf++) = hex[(h>>28)& 0x0F];
*(buf++) = hex[(h>>24)& 0x0F];
*(buf++) = hex[(h>>20)& 0x0F];
*(buf++) = hex[(h>>16)& 0x0F];
*(buf++) = hex[(h>>12)& 0x0F];
*(buf++) = hex[(h>>8)& 0x0F];
*(buf++) = hex[(h>>4)& 0x0F];
*(buf++) = hex[h& 0x0F];
}
if (*fmt == 'x') {
register int h = va_arg(args,int);
*(buf++) = hex[(h>>12)& 0x0F];
*(buf++) = hex[(h>>8)& 0x0F];
*(buf++) = hex[(h>>4)& 0x0F];
*(buf++) = hex[h& 0x0F];
}
if (*fmt == 'b') {
register int h = va_arg(args,int);
*(buf++) = hex[(h>>4)& 0x0F];
*(buf++) = hex[h& 0x0F];
}
if ((*fmt == 'd') || (*fmt == 'i')) {
register int dec = va_arg(args,int);
p = tmp;
if (dec = tmp) *(buf++) = *p;
}
if (*fmt == 'I') {
register long h = va_arg(args,long);
buf = sprintf(buf,"%d.%d.%d.%d",
(int)(h>>24) & 0x00FF,
(int)(h>>16) & 0x00FF,
(int)(h>>8) & 0x00FF,
(int)h & 0x00FF);
}
if (*fmt == 'c')
*(buf++) = va_arg(args,char);
if (*fmt == 's') {
p = va_arg(args,char *);
while (*p) *(buf++) = *p++;
}
} else *(buf++) = *fmt;
fmt++;
}
*buf = 0;
return(buf);
}
char *sprintf(char *buf, char *fmt,...)
{
va_list list;
char *res;
va_start(list,fmt);
res = do_printf(buf,fmt,list);
va_end(list);
return res;
}
请高手讲解:
char *do_printf(char *buf,char *fmt,va_list args)
{
register char *p;
char tmp[16];
while (*fmt) {
if (*fmt == 'n')
*(buf++) = 'r';
if (*fmt == '%') { /* switch() uses more space */
fmt++;
if (*fmt == 'X') {
register long h = va_arg(args,long);
*(buf++) = hex[(h>>28)& 0x0F];
*(buf++) = hex[(h>>24)& 0x0F];
*(buf++) = hex[(h>>20)& 0x0F];
*(buf++) = hex[(h>>16)& 0x0F];
*(buf++) = hex[(h>>12)& 0x0F];
*(buf++) = hex[(h>>8)& 0x0F];
*(buf++) = hex[(h>>4)& 0x0F];
*(buf++) = hex[h& 0x0F];
}
if (*fmt == 'x') {
register int h = va_arg(args,int);
*(buf++) = hex[(h>>12)& 0x0F];
*(buf++) = hex[(h>>8)& 0x0F];
*(buf++) = hex[(h>>4)& 0x0F];
*(buf++) = hex[h& 0x0F];
}
if (*fmt == 'b') {
register int h = va_arg(args,int);
*(buf++) = hex[(h>>4)& 0x0F];
*(buf++) = hex[h& 0x0F];
}
if ((*fmt == 'd') || (*fmt == 'i')) {
register int dec = va_arg(args,int);
p = tmp;
if (dec = tmp) *(buf++) = *p;
}
if (*fmt == 'I') {
register long h = va_arg(args,long);
buf = sprintf(buf,"%d.%d.%d.%d",
(int)(h>>24) & 0x00FF,
(int)(h>>16) & 0x00FF,
(int)(h>>8) & 0x00FF,
(int)h & 0x00FF);
}
if (*fmt == 'c')
*(buf++) = va_arg(args,char);
if (*fmt == 's') {
p = va_arg(args,char *);
while (*p) *(buf++) = *p++;
}
} else *(buf++) = *fmt;
fmt++;
}
*buf = 0;
return(buf);
}
char *sprintf(char *buf, char *fmt,...)
{
va_list list;
char *res;
va_start(list,fmt);
res = do_printf(buf,fmt,list);
va_end(list);
return res;
}
请高手讲解:
|
不用多加了,留着你的分数干点别的用吧.其实这就是一个C库函数.我偶尔用到.
我用伪指令简单写吧.
va_list类型数据可以统计出可变参数的数量.由于不是很常用,我就不加解释了.主要是我比较忙,懒得去查询.
sprint函数参数表中的三个点代表参数数量不定,可能是0个,1个,2个或者更多.
char *sprintf()
{
统计参数表中,参数的数量;
调用do_printf()函数,并用res接收返回植;
返回res;
}
char *do_printf()
{
while(fmt指向字符数据不是结束符)
{
如果*fmt为回车,则*buf赋值为换行;
如果*fmt为%,则++fmt,判断*fmt的字符,按照该字符,转换args中的参数为规定格式;
++fmt;
}
为buf字符串添加结束符;
返回buf字符串;
}
sprintf函数返回字符串的目的是实现以下结构:
a = sprintf(b, "格式变量", 参数, 参数,参数...);
我用伪指令简单写吧.
va_list类型数据可以统计出可变参数的数量.由于不是很常用,我就不加解释了.主要是我比较忙,懒得去查询.
sprint函数参数表中的三个点代表参数数量不定,可能是0个,1个,2个或者更多.
char *sprintf()
{
统计参数表中,参数的数量;
调用do_printf()函数,并用res接收返回植;
返回res;
}
char *do_printf()
{
while(fmt指向字符数据不是结束符)
{
如果*fmt为回车,则*buf赋值为换行;
如果*fmt为%,则++fmt,判断*fmt的字符,按照该字符,转换args中的参数为规定格式;
++fmt;
}
为buf字符串添加结束符;
返回buf字符串;
}
sprintf函数返回字符串的目的是实现以下结构:
a = sprintf(b, "格式变量", 参数, 参数,参数...);