Windows 编程基础:wsprintf 函数

专栏导航

上一篇:第2章,[标签 Win32] :格式化的消息框

回到目录

下一篇:第2章,[标签 Win32] :程序的 Debug 版和 Release 版

本节前言

对于本节所讲解的知识,有可能,你会需要时不时地参考本专栏的其它文章。真的遇到了需要参考之前的文章的知识点,请你自行查阅。

我呢,也会提到一部分的参考课节。但是呢,你不应该依赖于我的主动提及。最好呢,你自己能够多去了解和查看本专栏目录。

关于 wsprintf 函数,它是一个 Windows 版的格式字符串处理函数。它的用法,与 C 语言函数库里的 sprintf 函数比较相似。

在我们讲解 Windows API 知识的时候,我们使用 wsprintf 函数的机会比较多,因此,我们单独将 wsprintf 函数列出来,单独对它进行一番讲解。当然了,有可能,经过前面的一些个课节的学习,不需要我的讲解,你也已经理解了 wsprintf 函数的用法了。不过呢,在这里,我还是来讲讲它的用法。

我单独列出一节,来讲解此函数,这也意味着,wsprintf 函数的用法,你是务必掌握好的。

想要较为彻底地理解好此函数,你需要掌握前面学习过的,关于格式字符串的各个课节。

这些个参考课节,链接如下。

参考课节:编程技能:格式化打印01,vsprintf 函数族简介

参考课节:编程技能:格式化打印02,vsprintf

参考课节:编程技能:格式化打印03,printf

参考课节:编程技能:格式化打印04,sprintf

参考课节:编程技能:格式化打印05,格式控制符

参考课节:第2章 :在 Windows 中使用 vsprintf 函数族

参考课节:第2章,[标签 Win32] :格式化的消息框

我们开始本节的学习。

一. 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 知识的时候,自会用到,到时候再说。

本节内容,还是比较重要的,大家务必要学会它。

专栏导航

上一篇:第2章,[标签 Win32] :格式化的消息框

回到目录

下一篇:第2章,[标签 Win32] :程序的 Debug 版和 Release 版

相关推荐
大地的一角2 小时前
(C++)自定义功能基础汇总
开发语言·c++
Hello eveybody2 小时前
什么是动态规划(DP)?(C++版)
c++·动态规划
一个人旅程~2 小时前
QQ音乐、potplayer、VLC等对音乐格式的支持和加密文件格式的转换有哪些方法?potplayer的音质相对于VLC有哪些特点?
windows·经验分享·电脑·音视频
jiayong232 小时前
Windows系统密码重置完整指南
windows
橘色的喵2 小时前
现代C++嵌入式消息总线的回调优化: 从 std::function 到零开销分发
c++·function
白太岁2 小时前
操作系统开发:(7) 优先级反转与继承、TLS 及核亲和性
c语言·单片机·系统架构
yblackd2 小时前
UnrealEngine Win风格 窗口选择打开文件
c++·ue5·虚幻
橘色的喵2 小时前
C++17 vs C 编译产物体积:工业嵌入式场景的实测与分析
c语言·c++·c++17
㱘郳2 小时前
通过注册表编辑器删除百度网盘的右键菜单、驱动器快捷方式和“我的电脑”图标
windows·编辑器·百度云