1. 命令行模式的字符输出
在命令行输出模式,可以使用printf和sprintf函数:
int printf(const char* format, ...);
int sprintf(char *szBuffer, const char* format, ...);
但是,坏消息是:在windows程序中不能使用printf函数;
好消息是:windows程序中可以使用sprintf函数。
在windows中使用MessageBox可以得到同样或者更优于printf的结果。
2. windows消息框输出
在使用sprintf的时候还要考虑一个问题,那就是你所定义的字符缓冲区必须足够大以存放结果,vsprintf是sprintf的一个变形,它只有3个参数。
int vsprintf(char *szBuffer, const char* format, va_list ap)
vsprintf的前两个参数与sprintf相同,一个用于保存结果的字符缓冲区和一个格式字符串;第三个参数是指向格式化参数的数组的指针。实际上该指针指向在堆栈中供函数呼叫的变量。
va_list, va_start和va_end宏(在stdarg.h中定义),帮助我们处理堆栈指针。
使用vsprintf函数,sprintf函数可以这样写:
int sprintf(char *szBuf, const char *format, ...)
{
int nReturn;
va_list va;
va_start(va, format);
iReturn = vsprintf(szBuf, format, va);
va_end(va);
return iReturn;
}
va_start宏将va设置为指向一个堆栈变量,该变量地址在堆栈参数format上面。
Unicode问题:windows的wsprintf和wvsprintf函数在功能上和sprintf和vsprintf相同,但他们不支持浮点格式。
格式化消息框:
int CDECL ErrMsg(TCHAR* szCaption, TCHAR* szFormat, ...)
{
TCHAR szBuffer[1024];
va_list va;
va_start(va, szFormat);
wvsprintf(szBuffer, szFormat, va);
va_end(va);
return MessageBox(NULL, szBuffer, szCaption, 0);
}