/*不定个数参数输入处理*/
#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) |