#include
#include
void minprintf(char *fmt,...);
int main(int argc, char* argv[])
{
int a = 10;
minprintf("I have %d books",a);
return 0;
}
void minprintf(char *fmt,...)
{
va_list ap;//依次指向无名参数
va_start(ap,fmt);
char* p;
char* sval;
int ival;
int dval;
for(p = fmt;*p;++p)
{
if(*p != '%')
{
putchar(*p);
continue;
}
switch(*++p)
{
case 'd':
ival = va_arg(ap,int);//调用va_arg,返回一个参数
printf("%d",ival);
break;
case 'f':
dval = va_arg(ap,double);
printf("%f",dval);
break;
case 's':
for(sval = va_arg(ap,char*);*sval;sval++)
putchar(*sval);
break;
default:
putchar(*p);
break;
}
}
va_end(ap);//结束调用清理
}
对于没有名字的参数表,stdarg.h中的一组宏定义了何如使用它们。
需要注意的是,当启动一个C程序时,系统已经自动打开了3个文件,stdin、stdout和stderr,其中stdin指向键盘;而后面两个指向显示器。下面通过一个将多个文件的字符连着打印出来来说明这个问题:
int main(int argc, char* argv[])
{
FILE *fp;
char *prog = argv[0];//记下程序名
if(argc == 1)//如果只有一个参数,那么把输入的东西原封不动的输出
filecopy(stdin,stdout);
else
{
while(--argc > 0)
{
if((fp = fopen(*++argv,"r")) == NULL)
{
fprintf(stderr,"%s:can't open %s\n",prog,*argv);
exit(1);
}
else
{
filecopy(fp,stdout);
fclose(fp);
}
}
}
if(ferror(stdout))//如果流出错,将会返回非0值
{
fprintf(stderr,"%s: error writing stdout\n",prog);
exit(2);
}
exit(0);
}
void filecopy(FILE *ifp, FILE *ofp)
{
int c;
while((c = getc(ifp)) != EOF)
putc(c,ofp);
}