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);
}