当前位置: 技术问答>linux和unix
立即送分!如何实现象printf(char * ,...),的可变的参数????????
来源: 互联网 发布时间:2014-12-28
本文导语: 立即送分!如何实现象printf(char * ,...),的可变的参数???????? | 参看 va_list va_start() va_arg() va_end() 等 如下面这个例子 void foo(char *fmt, ...) { ...
立即送分!如何实现象printf(char * ,...),的可变的参数????????
|
参看 va_list va_start() va_arg() va_end() 等
如下面这个例子
void foo(char *fmt, ...)
{
va_list ap;
int d;
char c, *s;
va_start(ap, fmt);
while (*fmt)
switch(*fmt++) {
case 's': /* string */
s = va_arg(ap, char *);
printf("string %sn", s);
break;
case 'd': /* int */
d = va_arg(ap, int);
printf("int %dn", d);
break;
case 'c': /* char */
/* Note: char is promoted to int. */
c = va_arg(ap, int);
printf("char %cn", c);
break;
}
va_end(ap);
}
如下面这个例子
void foo(char *fmt, ...)
{
va_list ap;
int d;
char c, *s;
va_start(ap, fmt);
while (*fmt)
switch(*fmt++) {
case 's': /* string */
s = va_arg(ap, char *);
printf("string %sn", s);
break;
case 'd': /* int */
d = va_arg(ap, int);
printf("int %dn", d);
break;
case 'c': /* char */
/* Note: char is promoted to int. */
c = va_arg(ap, int);
printf("char %cn", c);
break;
}
va_end(ap);
}
|
我编过定制unix FORM(输入、输出、菜单、操作INFORMIX、C/S模式)的工具,将其中有关你的问题的函数贴出:
void PrintForm(code, lin, col, va_alist)
short code;
short lin;
short col;
va_dcl
{
va_list ap;
char buf[256];
char *fmt;
if(Dlgwin[code]==NULL) return;
va_start(ap);
fmt = va_arg(ap, char *);
wmove(Dlgwin[code], lin, col);// Dlgwin[code] 是WINDOWS *
vwprintw(Dlgwin[code], fmt, ap);
va_end(ap);
wrefresh(Dlgwin[code]);
}
MsgBox(type, va_alist)
short type;
va_dcl
{
va_list ap;
static char Msg[1024];
char *fmt;
memset(Msg, 0, sizeof(Msg));
va_start(ap);
fmt = va_arg(ap, char *);
vsprintf(Msg, fmt, ap);
va_end(ap);
MsgWindow(Msg, type);//输出到屏幕
return -1;
}
void PrintForm(code, lin, col, va_alist)
short code;
short lin;
short col;
va_dcl
{
va_list ap;
char buf[256];
char *fmt;
if(Dlgwin[code]==NULL) return;
va_start(ap);
fmt = va_arg(ap, char *);
wmove(Dlgwin[code], lin, col);// Dlgwin[code] 是WINDOWS *
vwprintw(Dlgwin[code], fmt, ap);
va_end(ap);
wrefresh(Dlgwin[code]);
}
MsgBox(type, va_alist)
short type;
va_dcl
{
va_list ap;
static char Msg[1024];
char *fmt;
memset(Msg, 0, sizeof(Msg));
va_start(ap);
fmt = va_arg(ap, char *);
vsprintf(Msg, fmt, ap);
va_end(ap);
MsgWindow(Msg, type);//输出到屏幕
return -1;
}
|
给你一个我写的函数,参考参考
/*验证不定参数*/
#include
#include
#include
void foo(const char *fmt, ...);
int main(void)
{
foo("ssdcds", "Hello", "world.", 50, 'a', 2000, "END");
return 0;
}
void foo(const char *fmt, ...)
{
va_list ap;
int d;
char c, *s;
va_start(ap, fmt);
while(*fmt)
{
switch(*fmt++)
{
/* string */
case 's':
s = va_arg(ap, char *);
printf("string %sn", s);
break;
/* int */
case 'd':
d = va_arg(ap, int);
printf("int %dn", d);
break;
/* char */
case 'c':
c = va_arg(ap, char);
printf("char %cn", c);
break;
default:
break;
}
}
va_end(ap);
}
/*验证不定参数*/
#include
#include
#include
void foo(const char *fmt, ...);
int main(void)
{
foo("ssdcds", "Hello", "world.", 50, 'a', 2000, "END");
return 0;
}
void foo(const char *fmt, ...)
{
va_list ap;
int d;
char c, *s;
va_start(ap, fmt);
while(*fmt)
{
switch(*fmt++)
{
/* string */
case 's':
s = va_arg(ap, char *);
printf("string %sn", s);
break;
/* int */
case 'd':
d = va_arg(ap, int);
printf("int %dn", d);
break;
/* char */
case 'c':
c = va_arg(ap, char);
printf("char %cn", c);
break;
default:
break;
}
}
va_end(ap);
}
|
这是我做的一个打印日志的函数可以借鉴下
#include
#include
void xv_usrlog(char *i_sLogFile, char *i_sFmt, ...)
{
FILE *fp;
char sFull[128];
va_list args;
sprintf(sFull, "%s/log/%s", getenv("HOME"), i_sLogFile);
if(fp = fopen(sFull, "a"))
{
va_start(args, i_sFmt);
vfprintf(fp, i_sFmt, args);
va_end(args);
}
fflush(fp);
fclose(fp);
}
#include
#include
void xv_usrlog(char *i_sLogFile, char *i_sFmt, ...)
{
FILE *fp;
char sFull[128];
va_list args;
sprintf(sFull, "%s/log/%s", getenv("HOME"), i_sLogFile);
if(fp = fopen(sFull, "a"))
{
va_start(args, i_sFmt);
vfprintf(fp, i_sFmt, args);
va_end(args);
}
fflush(fp);
fclose(fp);
}
|
楼上那位兄弟所说方法可行,但比较麻烦,可以简化一下
void foo( char* fmt, ... ) {
char buffer[ MAX_BUFFER_SIZE ];
va_list va_params;
va_start( va_params, fmt );
vsprintf( buffer, fmt, va_params );
va_end( va_params );
printf( "%s", buffer );
}
void foo( char* fmt, ... ) {
char buffer[ MAX_BUFFER_SIZE ];
va_list va_params;
va_start( va_params, fmt );
vsprintf( buffer, fmt, va_params );
va_end( va_params );
printf( "%s", buffer );
}
|
第一个例子主要是说明如何一个一个取参数,分析参数,当然不要自己去这么实现
第二个例子说明如何调用象vsprintf这样的函数
都很有用
关键是仔细看看这几个函数的文档
第二个例子说明如何调用象vsprintf这样的函数
都很有用
关键是仔细看看这几个函数的文档