Chinaunix首页 | 论坛 | 博客
  • 博客访问: 300017
  • 博文数量: 70
  • 博客积分: 1990
  • 博客等级: 上尉
  • 技术积分: 686
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-02 08:52
文章分类

全部博文(70)

文章存档

2015年(2)

2014年(9)

2013年(2)

2012年(20)

2011年(1)

2010年(36)

分类: C/C++

2010-12-02 15:30:55

/*不定个数参数输入处理*/
#include
#include
#include

int  cmd(char *format,...);
int main(int argc,char* argv[])
{
cmd("%s,%s,%s,%s","hello","no","world","va_list");
}
int cmd(char *format,...)   //形参保存在栈中,这里的形参都是字符串,栈中保存的只是各个字符串的首地址,在
{              //本例中栈中保存了format的首地址和4个字符串的首地址,即栈中形参指针有5个。
char comd[256];       //形参指针在栈中存放方式:栈的存放为"栈顶低址栈底高址,形参从右到左入栈,先入栈进栈底"。
char *cmmd=NULL;   
int cnt;
va_list pa;             //va_list定义:typedef  char * va_list,即pa为一个char型指针。
va_start(pa,format);    //指针pa初始化,使pa指向format后面的第一个变参地址,这里就是"hello"的地址。
printf("pa:%s\n",pa);   //这里每次运行的打印都不一样,猜测是打印形参指针的地址。
printf("cmd step1:%s\n",format);  //打印format形参的值。
memset(comd,0,256);   //vsnprintf函数的format是输出格式,这里依然用形参的format格式,pa指向的是"hello"形参地址。
vsnprintf(comd,sizeof(comd),format,pa);  //这里会按照format格式读取pa开始的变量列表的形参,由于format中有4个%,所以会读取4个变量的指针指向的值。
printf("vsprintf1:%s\n",comd);
cmmd=va_arg(pa,char *);  //va_arg函数返回变量列表的下一个变量的地址,这里就是第二个形参变量"no"的地址。
printf("cmd step2:%s\n",cmmd);   //打印第一个变参参数
memset(comd,0,256);
vsnprintf(comd,sizeof(comd),format,pa);  //打印format格式的pa开始的变量列表指针指向的值,由于format中有4个%,所以会读取4个变量的指针指向的值。
printf("vsprintf2:%s\n",comd);    //这里最后一个由于不是传进来的形参变量的指针,所以是个随机值。
//printf("%s\n",*((char *)pa));
cmmd=va_arg(pa,char *);  //
printf("cmd step3:%s\n",cmmd);
memset(comd,0,256);
vsnprintf(comd,sizeof(comd),format,pa);
printf("vsprintf3:%s\n",comd); 
cmmd=va_arg(pa,char *);
printf("cmd step4:%s\n",cmmd);
memset(comd,0,256);
vsnprintf(comd,sizeof(comd),format,pa);
printf("vsprintf4:%s\n",comd);
va_end(pa);
}
阅读(1116) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-12-05 15:10:12

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com