现在才发现,我这个问题描述不好,首先因为va_list并非我误以为的char *类型,它只是一个可以存放可变参数的“容器”;其实我只想知道scanf如何得知了不确定参数的存在并对其进行赋值,这一点我已经找到更好的回答;最后,感谢大家的回答,并附上自己写的一个从文档中根据某种格式读取字符、整数、小数的程序,写此程序的初衷是进行类似Scanf(fp, "%f%d", &coef, &expn)的调用,以便获取某多项式各项的系数coef和指数expn...
程序代码:
int Scanf(FILE *fp, char *format,...)
{
int *i;
char *ch;
float *f;
int count, k, len;
int tmp;
len = strlen(format);
va_list ap;
va_start(ap, format);
count = 0;
for(k=2; k<=len; k=k+2)
{
if(format[k-1]=='c') //读取字符
{
ch = va_arg(ap, char*);
count += fscanf(fp, "%c", ch);
}
if(format[k-1]=='d')
{
i = va_arg(ap, int*);
while((tmp=getc(fp))!=EOF)
{
if((tmp>='0' && tmp<='9') || tmp=='-')
{
ungetc(tmp, fp);
break;
}
}
if(tmp!=EOF)
count += fscanf(fp, "%d", i);
}
if(format[k-1]=='f')
{
f = va_arg(ap, float*);
while((tmp=getc(fp))!=EOF)
{
if((tmp>='0' && tmp<='9') || tmp=='-')
{
ungetc(tmp, fp);
break;
}
}
if(tmp!=EOF)
count += fscanf(fp, "%f", f);
}
}
va_end(ap);
return count;
}