专栏导航
下一篇:第2章,[标签 Win32] :程序的 Debug 版和 Release 版
本节前言
对于本节所讲解的知识,有可能,你会需要时不时地参考本专栏的其它文章。真的遇到了需要参考之前的文章的知识点,请你自行查阅。
我呢,也会提到一部分的参考课节。但是呢,你不应该依赖于我的主动提及。最好呢,你自己能够多去了解和查看本专栏目录。
关于 wsprintf 函数,它是一个 Windows 版的格式字符串处理函数。它的用法,与 C 语言函数库里的 sprintf 函数比较相似。
在我们讲解 Windows API 知识的时候,我们使用 wsprintf 函数的机会比较多,因此,我们单独将 wsprintf 函数列出来,单独对它进行一番讲解。当然了,有可能,经过前面的一些个课节的学习,不需要我的讲解,你也已经理解了 wsprintf 函数的用法了。不过呢,在这里,我还是来讲讲它的用法。
我单独列出一节,来讲解此函数,这也意味着,wsprintf 函数的用法,你是务必掌握好的。
想要较为彻底地理解好此函数,你需要掌握前面学习过的,关于格式字符串的各个课节。
这些个参考课节,链接如下。
参考课节:编程技能:格式化打印01,vsprintf 函数族简介
参考课节:编程技能:格式化打印03,printf
参考课节:编程技能:格式化打印04,sprintf
参考课节:编程技能:格式化打印05,格式控制符
参考课节:第2章 :在 Windows 中使用 vsprintf 函数族
我们开始本节的学习。
一. wsprintf 函数的使用方法
以下代码,是此函数的基本使用格式。
nLength = wsprintf (szBuffer, format, ...);
上式中,接收返回值的变量,nLength,你通常可以将其定义为一个 int 型变量,也可以将其定义为一个 long 型变量。
第一个参数,szBuffer,它被称作字符缓冲区,或者简称缓冲区。实质上,它是一个字符数组,通常,我们可以将其定义为右边的形式:【TCHAR szBuffer[40];】。在这个定义代码中,我将其定义成了一个包含 40 个 TCHAR 字符的字符数组,其实你也可以将数组元素的数目定义得大一些,比如定义为 60 个,90 个,300 个,看你的程序的需要而定。
第二个参数,它是一个指针变量,指向的内容是可以包含 %d,%c,%s 等等的格式控制符的字符串。我们通常将第二个参数叫做格式字符串,其实它是一个指向格式字符串的指针。叫白了,你也可以称作格式字符串的。
最后的参数,三个点,【...】,表示可变参数列表。这个可变参数列表,其中包含的参数个数,可以是 1 个,可以是多于 1 个,也可以是 0 个。数量不固定,数量可变,因此这个参数列表叫做可变参数列表。许多的格式字符串函数里面,可变参数列表,都位于格式字符串的紧接着的右边的位置。
对于 wsprintf 函数,我们先了解其用法,然后,再讲解其功能。
对于 printf 函数,我相信,大家应该是比较熟悉的。
代码【printf ("%d + %d = %d", 1, 2, 1 + 2);】的运行效果,相信大家是比较清楚的。在这个代码里面,printf 的第一个参数,也就是【"%d + %d = %d"】,它叫做格式字符串。格式字符串后面的【1, 2, 1 + 2】,它叫做可变参数列表。而格式字符串中的 %d,%c,%s 等等的东西,叫做格式控制符。本代码语句的执行过程就是,将格式字符串里面的 %d,%c,%s 等等的格式控制符,按出现的先后顺序,依次替换为可变参数列表中的各个参数。第一个格式控制符替换为可变参数列表中的第一个参数,第二个格式控制符替换为可变参数列表中的第二个参数,以此类推。全部替换好之后,会形成一个转换好的,新的字符串,【"1 + 2 = 3"】,这个新的字符串会被存放到一个缓冲区里面,然后程序会将此缓冲区中的转换好了的字符串,打印输出。
讲完了 printf ,我们再来说 wsprintf 。
假定,我们已事先定义了一个字符数组,【TCHAR szBuffer[60];】,然后呢,我们来使用 wsprintf。
代码为:【nLength = wsprintf (szBuffer, TEXT("%d + %d = %d"), 1, 2, 1 + 2);】
上述代码与 printf 的执行过程有着相似之处。它是将格式字符串【TEXT("%d + %d = %d")】与格式字符串右边的可变参数列表【1, 2, 1 + 2】,按照出现的先后次序,依次进行变量替换,最后的转换结果是,形成一个新的字符串,【TEXT("1 + 2 = 3")】,这个转换结果被存放在缓冲区 szBuffer 之中。这个缓冲区,其实就是字符数组。不过,这个字符数组的每一个字符,是 TCHAR 类型的,它可能是 ASCII 字符,有可能是 Unicode 字符,取决于你的程序中是否定义了 UNICODE 标识符。
二. wsprintf 函数的功能
经过 printf 与 wsprintf 的类比,我们来总体地说说 wsprintf 的功能。
我们还是先将 wsprintf 的基本使用格式写在下面。
nLength = wsprintf (szBuffer, format, ...);
wsprintf 函数的功能是,将格式字符串 format 中的各个格式控制符,用可变参数列表中的各个参数作出变量替换,转换之后的字符串结果,存放在缓冲区 szBuffer 中。返回值为转换好了的字符串结果中的有效字符数,不包含结尾的 NULL 字符。
注意,返回值是字符数,而不是字节数。
格式控制符,就是 %d,%c,%s 之类的东西。格式字符串,是待转换字符串,可能包含有格式控制符。
比如【printf ("%d + %d = %d", 1, 2, 1 + 2);】里面,printf 函数的第一个参数,【"%d + %d = %d"】,就是格式字符串。格式字符串里面包含有 3 个 %d,也就是包含三个格式控制符 。
当然了,你也可以这么写代码,【printf ("a winter day");】。在这个代码里,printf 函数的第一个参数,也是唯一的一个参数,它依然是一个格式字符串。但是,这个格式字符串里面,不含有任何的格式控制符。
格式字符串里面可以包含格式控制符,既可以包含一个格式控制符,也可以包含有多个格式控制符。格式字符串里面,其实也可以不包含格式控制符。究竟是否要在格式字符串里面包含格式控制符,这个看你的需求。
wsprintf 函数的格式字符串 format,既可以指向 Unicode 字符串,也可以指向 ASCII 字符串。无论是指向 Unicode 字符串还是 ASCII 字符串,返回值,为有效字符数。比如,转换好了的字符串结果为 【1+10=11】。我们不看外面的括号,里面的算式包含的字符数为 7 个,这 7 个字符占用的字节数为 14 个字节。
wsprintf 返回的,是有效字符数,是 7,不是 字节数 14 。
总 结
上面的内容,略微领大家了解了一下 wsprintf 函数的使用方法。如果,本节前言中给出的几个参考链接的内容,你都学会了,那么,即使我不讲,相信,你也能够使用好 wsprintf 函数的。
不过,我还是有些不放心,所以,还是讲了讲 wsprintf 函数。若是看不懂,还是请你务必先学习本节前言部分给出的参考链接。若是还不会,请多看几遍。还不会的话,请联系我。
问我也不行,那就问问别人吧。
务必要学好此函数。
在学习 Windows API 知识的时候,wsprintf 还是比较重要的。
在以后,学习 MFC 的时候,我们还是会有,对字符串进行格式化转换的需要,会有类似于使用 printf 函数的需要。在学习 Windows API 的时候,我们可以用 wsprintf 函数来解决此需要。而在学习 MFC 的时候,我们可以使用一个新的方法,那就是对 CString 类的对象,使用 Format 方法。
在 MFC 里面使用 CString 类的 Format 方法,这是后话了,我们在学习 MFC 知识的时候,自会用到,到时候再说。
本节内容,还是比较重要的,大家务必要学会它。