当前位置:  技术问答>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;
}

请高手讲解:

|
不用多加了,留着你的分数干点别的用吧.其实这就是一个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, "格式变量", 参数, 参数,参数...);

    
 
 

您可能感兴趣的文章:

  • 高手指点:听说jdk1.4能设置超时,请讲解一下?
  • 请高手给讲解一下堆栈、堆、静态存储等概念
  • 请高手讲解一下gcc和g++的区别和联系,多谢了!
  • 跪请高手讲解:pthread怎么啦?
  • 哪位高手能帮我讲解一下端口的概念?急
  • 嵌入式系统中是不是不需要分段、分页机制?请高手讲解一下分段分页机制,谢谢:)
  • 我用mount命令后出现如下信息,请高手帮忙逐行讲解?我登陆的是别人的机器,看不懂??
  • Thinking in Java 的一个例子,请高手给讲解一下
  • 那位高手能给我讲解一下各layout的区别????
  • 请问高手:Ctrl+Alt+F1~F8可以切换虚拟终端,这个代码是在哪儿实现的?我搞不懂,最好指点源代码大概位置。
  • 想成为java高手必须读jdk源代码吗?
  • 请高手们解惑,关于源代码
  • 求助 ==> 代码移殖:从Linux到的Windows,请高手指点一二,谢谢啦
  • 请高手帮我解释一下这段代码!!!
  • shell 编程 从0到10求和 ,代码有错,请高手看看
  • 各路JAVA高手们,能否给我一个用JAVA写的简单聊天室代码?
  • 用rose试图生成java代码,提示如下错误,求教高手!
  • 高分寻求JSP/Servlet写的聊天室源代码?请各位高手帮忙!
  • 急需关于linux多线程的代码工程实例-高手请进啊
  • RedHat 7.2的源代码在哪里?各位高手有的话,麻烦提供一下
  • 我在JBotton中怎么关闭本JFram?---请高手指教,最好给个代码!
  • 高手看看这段代码错在哪里
  • 请路过的高手指点什么地方可以找到LDAP原代码?
  • 关于socket通信,C的代码,有个问题请教高手!
  • 高手进,只求思路,不求代码!
  • 有那些高手将linux内核源代码完整的看过一遍啊
  • 100分相送能帮我从LINUX下提取ISO9660的源代码的高手
  • 注意了!!100分求购java Telnet客户端代码!!!高手指点同样给分!!
  • 现急需bmp文件转换成jpg文件的java源代码,请高手们帮帮忙,分数可再加。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 高手,高手,高高手请进!
  • 有熟悉EXIM的高手高手么??
  • to 高手:学java应该怎样一步步学习,从菜鸟到高手.
  • 高分请高手,高手定能解决
  • 请问高手在linux中用什么命令可以做linux的启动盘???在等待高手??
  • 有高手研究Agent++麽?里面有个thread.h,蛮难读的,请高手指点
  • 难道高手区里的人就是高手?
  • 在dos下用bc31挑战高手******开发mssql程序,连接时报link err:undefined symbol GETNOTE in module DBEXTERN?(挑战高手)
  • 真正的linux高手,请看过来,看你符合高手标准不?
  • 难道这没有高手吗?难道这没有乐于助人的高手?(高分酬谢62+50+50)
  • 关于我对linux高手用yum,非高手用源码的理由
  • 高手救命,很急——ORACLE817安装在UNIXWARE711上,手工启动数据库后在netasst中连接错误,高手帮我看看?
  • 请教高手lvs的奇怪问题,我挺着急,希望高手别潜水,就就我,先谢谢了
  • 各个高手看看这个问题!本人第一次学习java所以要各位高手的帮助。。
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 我是新手,高手,高手,快来救我
  • EJB问题,请教高手(非高手莫进)
  • 请各位JAVA高手,网业高手看过来,我把能给的分都送出!!!只能给37分,哎!!
  • eWEEK沙龙征集高手座谈


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3