经典windows编程-----printf

来源:互联网 发布:vue.js视频百度云 编辑:程序博客网 时间:2024/05/18 01:03

 

如果您从未使用过sprintf (我第一次开始写Windows程式时也没用过此函式),这里有一个简短的执行实体,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", 5, 3, 5+3) ;

的功能相同於

char szBuffer [100] ;sprintf (szBuffer, "The sum of %i and %i is %i", 5, 3, 5+3) ;puts (szBuffer) ;

在Windows中,使用MessageBox显示结果优於puts。

几乎每个人都经历过,当格式字串与被格式化的变数不合时,可能使printf执行错误并可能造成程式当掉。使用sprintf时,您不但要担心这些,而且还有一个新的负担:您定义的字串缓冲区必须足够大以存放结果。Microsoft专用函式_snprintf解决了这一问题,此函式引进了另一个参数,表示以字元计算的缓冲区大小。

vsprintf是sprintf的一个变形,它只有三个参数。vsprintf用於执行有多个参数的自订函式,类似printf格式。vsprintf的前两个参数与sprintf相同:一个用於保存结果的字元缓冲区和一个格式字串。第三个参数是指向格式化参数阵列的指标。实际上,该指标指向在堆叠中供函式呼叫的变数。va_list、va_start和va_end巨集(在STDARG.H中定义)帮助我们处理堆叠指标。本章最後的SCRNSIZE程式展示了使用这些巨集的方法。使用vsprintf函式,sprintf函式可以这样编写:

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

va_start巨集将pArg设置为指向一个堆叠变数,该变数位址在堆叠参数szFormat的上面。

由於许多Windows早期程式使用了sprintf和vsprintf,最终导致Microsoft向Windows API中增添了两个相似的函式。Windows的wsprintf和wvsprintf函式在功能上与sprintf和vsprintf相同,但它们不能处理浮点格式。

当然,随著宽字元的发表,sprintf类型的函式增加许多,使得函式名称变得极为混乱。表2-1列出了Microsoft的C执行时期程式库和Windows支援的所有sprintf函式。

 

在宽字元版的sprintf函式中,将字串缓冲区定义为宽字串。在宽字元版的所有这些函式中,格式字串必须是宽字串。不过,您必须确保传递给这些函式的其他字串也必须由宽字元组成。

 

所示的SCRNSIZE程式展示了如何实作MessageBoxPrintf函式,该函式有许多参数并能像printf那样编排它们的格式。

SCRNSIZESCRNSIZE.C/*---------------------------------------------------------------------------SCRNSIZE.C --Displays screen size in a message box  (c) Charles Petzold, 1998----------------------------------------------------------------------------*/#include <windows.h>#include <tchar.h>     #include <stdio.h>     int CDECL MessageBoxPrintf (TCHAR * szCaption, TCHAR * szFormat, ...){TCHAR   szBuffer [1024] ;va_list pArgList ;// The va_start macro (defined in STDARG.H) is usually equivalent to:// pArgList = (char *) &szFormat + sizeof (szFormat) ;va_start (pArgList, szFormat) ;// The last argument to wvsprintf points to the arguments_vsntprintf (szBuffer, sizeof (szBuffer) / sizeof (TCHAR), szFormat, pArgList) ;// The va_end macro just zeroes out pArgList for no good reasonva_end (pArgList) ;return MessageBox (NULL, szBuffer, szCaption, 0) ;}int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow) {int cxScreen, cyScreen ;cxScreen = GetSystemMetrics (SM_CXSCREEN) ;cyScreen = GetSystemMetrics (SM_CYSCREEN) ;MessageBoxPrintf (TEXT ("ScrnSize"), TEXT ("The screen is %i pixels wide by %i pixels high."),cxScreen, cyScreen) ;return 0 ;}

经由从GetSystemMetrics函式得到的资讯,该程式以图素为单位显示了视讯显示的宽度和高度。GetSystemMetrics是一个能用来获得Windows中不同物件的尺寸资讯的函式。事实上,我将在第四章用GetSystemMetrics函式向您展示如何在一个Windows视窗中显示和滚动多行文字。

 

原创粉丝点击