CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

[求教]怎么写类似printf这类任意长度参数的函数?

楼主sunjx119(睿锐)2004-11-04 13:51:38 在 C/C++ / C++ 语言 提问

rt,请教. 问题点数:0、回复次数:5Top

1 楼freefalcon(心宇—消失中...)回复于 2004-11-04 13:56:56 得分 0

ft,   不要一下发两遍,除非你确定这个问题很难  
   
  #include   "stdio.h"  
  #include   "stdarg.h"  
   
  void   myprintf(const   char*   fmt,   ...)  
  {  
          va_list   va;  
          va_start(va,   fmt);  
          printf("in   myprintf\n");  
  #if   1  
          int   i   =   va_arg(   va,   int);   //   获得单个参数  
          printf("%d\n",   i);          
          const   char*   s   =   va_arg(   va,   const   char*);  
          printf("%s\n",   s);  
          float   f   =   va_arg(va,   double);  
          printf("%f\n",   f);  
  #else  
          vprintf(fmt,   va);   //   使用整个可变参数列表  
  #endif  
          va_end(va);  
  }  
   
  int   main(int   argc,   char*   argv[])  
  {  
          myprintf("%d\n%s\n%f\n",   1234,   "hi",   3.14);  
       
          return   0;  
  }Top

2 楼titilima(李马 - www.titilima.cn)回复于 2004-11-04 13:57:27 得分 0

首先你需要一个接收va_list类型参数的函数,然后借助这个函数来完成。以printf为例:  
  int   printf(char   *   szBuffer,   const   char   *   szFormat,   ...)  
  {  
      int           iReturn;  
      va_list   pArgs;  
      va_start(pArgs,   szFormat);  
      iReturn   =   vprintf(szFormat,   pArgs);  
      va_end   (pArgs);  
      return   iReturn;  
  }Top

3 楼xu123(剑煮酒无味,饮一杯为谁)回复于 2004-11-04 14:27:06 得分 0

学习...Top

4 楼kunpengzhi(学思)回复于 2004-11-04 14:43:23 得分 0

建议看一下K&R的《The   C   Programming   Language》中的相关描述,个人认为,讲解很到位Top

5 楼limlzm(凡叶)回复于 2004-11-04 15:45:41 得分 0

void   foo(char   *fmt,   ...)  
                        {  
                                        va_list   ap;  
                                        int   d;  
                                        char   c,   *p,   *s;  
   
                                        va_start(ap,   fmt);  
                                        while   (*fmt)  
                                                        switch   (*fmt++)   {  
                                                        case   's':                                               /*   string   */  
                                                                        s   =   va_arg(ap,   char   *);  
                                                                        printf("string   %s\n",   s);  
                                                                        break;  
                                                        case   'd':                                               /*   int   */  
                                                                        d   =   va_arg(ap,   int);  
                                                                        printf("int   %d\n",   d);  
                                                                        break;  
                                                        case   'c':                                               /*   char   */  
                                                                        c   =   va_arg(ap,   char);  
                                                                        printf("char   %c\n",   c);  
                                                                        break;  
                                                        }  
                                          va_end(ap);  
                            }Top

相关问题

  • VB中的不定数量的参数如何用C中的形式表示?比如printf函数,后面可以输入任意个参数
  • 怎么声明任意个参数的函数?
  • 在Midas中,可以做传递任意参数的函数给服务器么?
  • 关于printf函数的参数问题,简单?!请看看^_^
  • biosdisk()函数参数
  • 函数和参数
  • 能否实现类似printf()那样的函数: 参数可选?谢谢!
  • 象printf这样参数个数不限定的函数体怎么写啊?
  • 请教高人类似于printf()函数后面的格式化参数
  • WSAAsyncSelect 函数参数问题

关键词

  • 函数
  • start
  • va
  • 参数
  • myprintf
  • pargs
  • fmt
  • szformat
  • ireturn
  • printf

得分解答快速导航

  • 帖主:sunjx119

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo