当前位置:  技术问答>linux和unix

立即送分!如何实现象printf(char * ,...),的可变的参数????????

    来源: 互联网  发布时间:2014-12-28

    本文导语:  立即送分!如何实现象printf(char * ,...),的可变的参数???????? | 参看 va_list va_start() va_arg() va_end() 等 如下面这个例子            void foo(char *fmt, ...)            {    ...

立即送分!如何实现象printf(char * ,...),的可变的参数????????

|
参看 va_list va_start() va_arg() va_end() 等
如下面这个例子
           void foo(char *fmt, ...)
           {
                   va_list ap;
                   int d;
                   char c, *s;

                   va_start(ap, fmt);
                   while (*fmt)
                           switch(*fmt++) {
                           case 's':                       /* string */
                                   s = va_arg(ap, char *);
                                   printf("string %sn", s);
                                   break;
                           case 'd':                       /* int */
                                   d = va_arg(ap, int);
                                   printf("int %dn", d);
                                   break;
                           case 'c':                       /* char */
                                   /* Note: char is promoted to int. */
                                   c = va_arg(ap, int);
                                   printf("char %cn", c);
                                   break;
                           }
                   va_end(ap);
           }

|
我编过定制unix FORM(输入、输出、菜单、操作INFORMIX、C/S模式)的工具,将其中有关你的问题的函数贴出:

void PrintForm(code, lin, col, va_alist)
short code;
short lin;
short col;
va_dcl
{
 va_list ap;
 char buf[256];
 char *fmt;
 if(Dlgwin[code]==NULL) return;
 va_start(ap);
 fmt = va_arg(ap, char *);
 wmove(Dlgwin[code], lin, col);// Dlgwin[code] 是WINDOWS * 
 vwprintw(Dlgwin[code], fmt, ap);
 va_end(ap);
 wrefresh(Dlgwin[code]);
}


MsgBox(type, va_alist)
short type;
va_dcl
{
 va_list ap;
 static char Msg[1024];
 char *fmt;
 memset(Msg, 0, sizeof(Msg));

 va_start(ap);
 fmt = va_arg(ap, char *);
 vsprintf(Msg, fmt, ap);
 va_end(ap);
 MsgWindow(Msg, type);//输出到屏幕
return -1;
}




|
给你一个我写的函数,参考参考
/*验证不定参数*/
#include 
#include 
#include 

void foo(const char *fmt, ...);

int main(void)
{
foo("ssdcds", "Hello", "world.", 50, 'a', 2000, "END");
return 0;
}

void foo(const char *fmt, ...)
{
va_list ap;
int d;
char c, *s;

va_start(ap, fmt);
while(*fmt)
{
switch(*fmt++)
{
/* string */
case 's':
s = va_arg(ap, char *);
printf("string %sn", s);
break;
/* int */
case 'd':
d = va_arg(ap, int);
printf("int %dn", d);
break;
/* char */
case 'c':
c = va_arg(ap, char);
printf("char %cn", c);
break;
default:
break;
}
}
va_end(ap);
}

|
这是我做的一个打印日志的函数可以借鉴下
#include 
#include 
void xv_usrlog(char *i_sLogFile, char *i_sFmt, ...)
{
    FILE *fp;
    char sFull[128];
    va_list args;

    sprintf(sFull, "%s/log/%s", getenv("HOME"), i_sLogFile);
    if(fp = fopen(sFull, "a"))
    {
        va_start(args, i_sFmt);
        vfprintf(fp, i_sFmt, args);
        va_end(args);
    }
    fflush(fp);
    fclose(fp);
}

|
楼上那位兄弟所说方法可行,但比较麻烦,可以简化一下
    void foo( char* fmt, ... ) {
char buffer[ MAX_BUFFER_SIZE ];
va_list va_params;
va_start( va_params, fmt );
vsprintf( buffer, fmt, va_params );
va_end( va_params );
         printf( "%s", buffer );
    }

|
第一个例子主要是说明如何一个一个取参数,分析参数,当然不要自己去这么实现
第二个例子说明如何调用象vsprintf这样的函数

都很有用

关键是仔细看看这几个函数的文档

    
 
 

您可能感兴趣的文章:

  • 用C或C++编程,模拟可变分区存储管理且首次适应的算法实现存储器的分配与回收
  • 用c语言根据可变参数合成字符串的实现代码
  • c语言可变参数实现示例
  • 用C#的params关键字实现方法形参个数可变示例
  • C++可变参数的实现方法
  • 如何实现linux下ant调用sh(带输入参数),参数自动填入并执行sh
  • asp.net 参数不同共用一个页面的实现方法
  • 如何往PATH环境变量中追加参数啊?(不要重新登陆实现)
  • 请问各位大虾,怎么实现三层页面之间的参数传递?
  • 整型数据做函数的参数,怎样实现传地址,和调用程序共用一个地址?
  • 请问在java里传递方法的可选参数是如何实现的
  • wlan ap中如何实现参数传递?
  • 如何实现带参数的自动页面跳转
  • 在java里是怎么实现一个方法返回多个参数的?
  • C# 运用params修饰符来实现变长参数传递的方法
  • 用户通过mozilla访问页面文件,提交的参数要记录到系统的配置文件中去,如何来实现这个接口?
  • linux下,要实现两个程序共享同一个串口,该怎么设置参数?谢谢
  • 动态生成的查询条件其参数传递如何实现?
  • 急!如何实现,点击链接时,将链接字符串内容做为参数,传递给下一页。急!
  • Python def函数的定义、使用及参数传递实现代码
  • Python实现partial改变方法默认参数
  • SHELL中for i=1 to 100之类的语句怎么写?我不能把1-100都放到参数表啊?a++运算怎么实现?
  • MySQL 存储过程传参数实现where id in(1,2,3,...)示例
  • 俺需要实现这样的功能:一个宏放在return前,把本函数中的入参都记录下来,当然不希望调用者传入参数,谢谢
  • 请问如何用java实现类似于c中的传引用参数的函数
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • socket实现多文件并发传输,求助多线程实现问题?
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • interface 到底有什么用???实现接口,怎么实现??
  • 通过javascript库JQuery实现页面跳转功能代码
  • 怎么用Jsp实现在页面实现树型结构?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • windows 下的PortTunnel 在linux下怎么实现?或者相应的已经实现的软件?端口映射
  • php实现socket实现客户端和服务端数据通信源代码
  • 网站重定向用C语言实现iptables,ACL实现
  • flash AS3反射实现(describeType和getDefinitionByName)
  • 在linux下如何编程实现nslookup命令实现的IP地址和域名互相转换的功能?
  • boost unordered_map和std::list相结合的实现LRU算法
  • 求在freebsd+Squid下实现pc上网的透明代理的实现方法!给出具体配置方法的高分谢!
  • c#通过委托delegate与Dictionary实现action选择器代码举例
  • linux下如实现与window下的驱动器实现文件共享??
  • 使用java jdk中的LinkedHashMap实现简单的LRU算法
  • qt如何实现:操作键盘实现数据的滚动?
  • iphone cocos2d 精灵的动画效果(图片,纹理,帧)CCAnimation实现
  • 我想用APPLET实现读取客户端的图片文件,该如何实现?
  • c语言判断某一年是否为闰年的各种实现程序代码
  • PING是用TCP,还是用UDP来实现的?或是采用其它协议实现的?


  • 站内导航:


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

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

    浙ICP备11055608号-3