第二章 Unicode简介 sprintf 、vsprintf 、_vsntprintf

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

运行结果:

第二章 Unicode简介 sprintf 、vsprintf 、_vsntprintf_第1张图片

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

运行结果:

第二章 Unicode简介 sprintf 、vsprintf 、_vsntprintf_第2张图片

使用_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;
}

运行结果:

第二章 Unicode简介 sprintf 、vsprintf 、_vsntprintf_第3张图片 

                                                         

                                                                                                                                ENGLISH:

                                                                                                                                                  format  格式化

                                                                                                                                                  buffer  缓冲

                                                                                                                                                  pixel 像素

                                                                                                                                                 caption 标题,说明文字

你可能感兴趣的:(Windows程序设计)