在C语言中 printf函数定义为:
int printf(const char *szFormat,...);
第一个参数:一个格式字符串,后面是与格式字符串中的代码相对应的不同类型的多个参数。
sprintf函数的定义为:
int sprintf(char *szBuffer, const char *szFormat,...);
第一个参数:一个字符缓冲区,后面是一个格式字符串。sprintf并不是把格式化结果写到标准输出,而是将其存入szBuffer。该函数返回该字符串的长度。
在字符模式编程环境中,语名:
printf("The sum of %i and %i is %i",6,3,6+3);
的功能等同于以下语句:
char szBuffer[255];
sprintf(szBuffer,"The sum of %i and %i is %i",6,3,6+3);
put(szBuffer);
而在Windows中,需要使用MessageBox而不是puts来显示结果。
使用sprintf函数实现MessageBox输出:
#include
#include
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
char szBuffer[250];
int cxScreen,cyScreen;
cxScreen = GetSystemMetrics(SM_CXSCREEN);
cyScreen = GetSystemMetrics(SM_CYSCREEN);
sprintf(szBuffer,"The screen is %i pixels width by %i pixels high.",cxScreen,cyScreen);
MessageBox(NULL,szBuffer,"sprintf",MB_OKCANCEL);
return 0;
}
运行结果:
sprintf函数还有一个变形函数vsprintf,它只有三个参数。当需要对可变参数执行像printf一样的格式化时,可以用vsprintf来实现你自己的函数。
vsprintf前两个参数与sprintf相同:一个用于保存结果的字符缓冲区和一个格式字符串。
第三个参数:指向待格式化的参数数组的指针。实际上,该指针指向在堆栈中供函数调用的变量。
宏va_list 、va_start 和 va_end (在STDARG.H中定义)帮助处理堆栈指针。
sprintf函数可以用vsprintf函数这样编写:
int sprintf(char *szBuffer, const char *szFormat, ... )
{
int iReturn;
va_list pArgs;
va_start (pArgs, szFormat);
iReturn = vsprintf(szBuffer, szFormat, pArgs);
va_end(pArgs);
return iReturn;
}
使用sprintf函数实现MessageBox输出:
#include
#include
int MsgVsprintf(char *szCaption,char *szFormat,...)
{
char szBuffer[255];
va_list pArglist;
va_start(pArglist,szFormat);
vsprintf(szBuffer,szFormat,pArglist);
va_end (pArglist);
return MessageBox(NULL,szBuffer,szCaption,0);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
int cxScreen,cyScreen;
cxScreen = GetSystemMetrics(SM_CXSCREEN);
cyScreen = GetSystemMetrics(SM_CYSCREEN);
MsgVsprintf(TEXT("vsprintf"),TEXT("The screen is %i pixels width by %i pixels high."),cxScreen,cyScreen);
return 0;
}
运行结果:
使用_vsntprintf函数实现MessageBox输出:
#include
#include
#include //没看懂为什么要加这个头文件
int CDECL MsgVsntprintf(char *szCaption, char *szFormat,...) //CDECL是一个参数进栈,所有参数从右到左依次入栈
{
char szBuffer[200];
va_list pArgList;
va_start (pArgList,szFormat);
_vsntprintf(szBuffer,sizeof(szBuffer)/sizeof(char),szFormat,pArgList);
va_end (pArgList);
return MessageBox(NULL,szBuffer,szCaption,0);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
int cxScreen,cyScreen;
cxScreen = GetSystemMetrics(SM_CXSCREEN);
cyScreen = GetSystemMetrics(SM_CYSCREEN);
MsgVsntprintf(TEXT("vsntprintf"),
TEXT("The screen is %i pixels width by %i pixels high."),
cxScreen,cyScreen);
return 0;
}
运行结果:
ENGLISH:
format 格式化
buffer 缓冲
pixel 像素
caption 标题,说明文字