首先要处理这种省略号的参数的话,需要包含头文件#include <stdarg.h>,然后利用下面的函数对“...”省略号变量进行处理。
va_list arg;
type va_arg( va_list arg, type );
void va_end( va_list arg );
void va_start( va_list arg, prev_param );
下面实现一个自己的print(),它的参数的传递是根据具体输入的个数决定的。如下:
void print(char *msg, ...)
{
char *p = msg;
va_list arg;
va_start(arg, msg);
int _i;
char _c;
char * _s;
while(*p != '\0')
{
switch(*p)
{
case '%':
p++;
switch(*p)
{
case 'd':
_i = va_arg(arg, int);
printf("%d", _i);
break;
case 'c':
_c = va_arg(arg, int);
printf("%c", _c);
break;
case 's':
_s = va_arg(arg, char*);
printf("%s", _s);
break;
default:
break;
}
break;
default:
printf("%c", *p);
break;
}
p++;
}
va_end(arg);
}
使用过程:
print("Hello %d, %s\n", 12, "World\n");
给出我的输出:
$ gcc main.c
$ ./a
Hello 12, World
当然这只是最简单的实现,实际的处理过程要比这复杂得多。仅供学习参考!!
给出完整的代码:
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
void print(char *msg, ...)
{
char *p = msg;
va_list arg;
va_start(arg, msg);
int _i;
char _c;
char * _s;
while(*p != '\0')
{
switch(*p)
{
case '%':
p++;
switch(*p)
{
case 'd':
_i = va_arg(arg, int);
printf("%d", _i);
break;
case 'c':
_c = va_arg(arg, int);
printf("%c", _c);
break;
case 's':
_s = va_arg(arg, char*);
printf("%s", _s);
break;
default:
break;
}
break;
default:
printf("%c", *p);
break;
}
p++;
}
va_end(arg);
}
int main(int argc, char **argv)
{
print("Hello %d, %s\n", 12, "World\n");
return 0;
}