专栏导航
上一篇:第2章 :兼容 ASCII 字符与宽字符的 Windows 函数调用
回到目录
下一篇:无
本节前言
在下面的文章链接里面,我们谈到过,使用兼容版的字符串处理函数的知识。
第2章 :编写兼容多字节字符集和 Unicode 字符集的 Windows 程序
在上面的链接里面,我们谈到了,如何使用一个统一的字符串函数,使得,当我们定义了 UNICODE 标识符的时候,我们所用的字符串函数就会指向 Unicode 版的字符串函数。而当我们没有定义 UNICODE 标识符的时候,我们所用的字符串函数会指向 ASCII 版的字符串函数。
比如说,我们常用的求字符串长度的函数,它的 ASCII 版为 strlen,Unicode 版为 wcslen,而兼容版为 _tcslen 。使用 _tcslen 的时候,如果我们定义了 UNICODE 标识符,则 _tcslen 就是 wcslen 。如果没有定义 UNICODE 标识符,则 _tcslen 就是 strlen 。
类似地,还有许多其它的一些个字符串处理函数,也都有它们的 ASCII 版,Unicode 版与兼容版。
ASCII 版,其前缀为 str 。Unicode 版,则是将 str 前缀替换为 wcs 。而兼容版,则是将 str 前缀替换为 _tcs 前缀。
我们来列出一个表格,来展示几个常用的字符串处理函数。
ASCII 版 | Unicode 版 | 兼容版 |
strlen | wcslen | _tcslen |
strcpy | wcscpy | _tcscpy |
strcat | wcscat | _tcscat |
strcmp | wcscmp | _tcscmp |
我们只是举出了四组字符串函数,它们分别有 ASCII 版,Unicode 版和兼容版。每一组函数里面,都是说,如果定义了 UNICODE 标识符,则兼容版函数就等同于 Unicode 版函数。如果没有定义 UNICODE 标识符,则兼容版函数就等同于 ASCII 版函数。
在这里,UNICODE 标识符与 _UNICODE 标识符,可以看作是同义语。
设置 _UNICODE 标识符的方法,在下面的文章链接中的【四.(二)】分节中有讲解。
第2章 :编写兼容多字节字符集和 Unicode 字符集的 Windows 程序
在本节里面呢,我们来讲解的是另一种兼容版的字符串函数。
本节开始。
一. Windows 的字符串函数
本节所述的几个 Windows 字符串函数,它们的数量是有限的。前言部分所述的那种,以 _tcs 作为前缀的兼容版字符串函数,它支持的字符串函数的数目是比较多的。
而本节所述的几个 Windows 字符串函数,它只是针对常用的几个字符串函数,设置了兼容函数。
我们一个一个地来看吧。
(一)strlen 的 WIndows 兼容版字符串函数
strlen 的 Windows 兼容版字符串函数为 lstrlen 。使用方法如下所示。
nLength = lstrlen(pString);
在上面的代码行中,假定 nLength 是一个 int 型变量,而参数 pString 则是一个字符串。
lstrlen 的使用方法与 strlen 是一样的。strlen 的具体使用方法,请参考下述文章链接。
编程技能:字符串函数05,strlen
本节,不具体讲 strlen,也不具体讲 lstrlen 。如果你还不会使用 strlen,那么,你可以先去学习上面的链接所示的文章的内容。
这个 lstrlen,它的功能与 _tcslen 是类似的。当定义了 UNICODE 标识符的时候,lstrlen 就是 Unicode 版的字符串函数, lstrlenW 。如果没有定义 UNICODE 标识符,则 lstrlen 就是 ASCII 版的字符串函数, lstrlenA 。lstrlenW 约等于 wcslen,lstrlenA 约等于 strlen 。
(二)strcpy 的 WIndows 兼容版字符串函数
strcpy 的 WIndows 兼容版字符串函数为 lstrcpy 。使用方法如下所示。
pString = lstrcpy(pString1, pString2);
lstrcpy 的第一个参数及其返回值,都是【TCHAR *】类型的。而第二个参数是【const TCHAR *】类型的。换一个说法,lstrcpy 的第一个参数及其返回值的类型为 LPTSTR,lstrcpy 的第二个参数的类型为 LPCTSTR 。
TCHAR,LPTSTR,LPCTSTR 的含义,请参阅下述文章链接。
参考课节:第2章 :Windows 字符数据类型
在上面的示例代码中,lstrcpy 的执行效果是,将 pString2 字符串复制到 pString1 所指向的字符指针位置。返回值为 pString1,这个返回值被赋值给了 pString 变量。
lstrcpy 的使用方法与 strcpy 是一样的。strcpy 的使用方法,请参考下述文章链接。
编程技能:字符串函数02,strcpy
lstrcpy 虽说与 strcpy 的使用方法相同,但是呢,在 Visual Studio 的环境里,存在着一点小的区别。那就是,默认情况下,你直接使用 strcpy,则 Visual Studio 会报错,它会建议你使用安全版本的 strcpy_s 函数。如果你还是想要使用 strcpy 函数,你需要去设置一下编译参数。设置方法,请参考下面的文章链接。
编程技能:字符串函数04,直接使用 strcpy,解决报错
而使用 lstrcpy 的话,你不需要考虑设置编译参数的问题,直接使用,Visual Studio 也不会报错的。
这个 lstrcpy,它的功能与 _tcscpy 是类似的。当定义了 UNICODE 标识符的时候,lstrcpy 就是 Unicode 版的字符串函数, lstrcpyW 。如果没有定义 UNICODE 标识符,则 lstrcpy 就是 ASCII 版的字符串函数, lstrcpyA 。lstrcpyW 约等于 wcscpy,lstrcpyA 约等于 strcpy 。
(三)strncpy 的 WIndows 兼容版字符串函数
strncpy 的 WIndows 兼容版字符串函数为 lstrcpyn 。使用方法如下所示。
pString = lstrcpyn(pString1, pString2, iCount);
在上面的案例代码里面,lstrcpyn 的第一个参数与返回值的类型均为【TCHAR *】,也就是 LPTSTR 。第二个参数的类型为【const TCHAR *】,也就是 LPCTSTR 。第三个参数的类型为 int 。
TCHAR,LPTSTR,LPCTSTR 的含义,请参阅下述文章链接。
参考课节:第2章 :Windows 字符数据类型
lstrcpyn 的用法与 strncpy 是一样的。strncpy 的用法,参考如下文章链接。
编程技能:字符串函数03,strncpy
lstrcpyn 虽说与 strncpy 的使用方法相同,但是呢,在 Visual Studio 的环境里,存在着一点小的区别。那就是,默认情况下,你直接使用 strncpy,则 Visual Studio 会报错,它会建议你使用安全版本的 strncpy_s 函数。如果你还是想要使用 strncpy 函数,你需要去设置一下编译参数。设置方法,请参考下面的文章链接。
编程技能:字符串函数04,直接使用 strcpy,解决报错
这个参考链接,你没有看错。我只给 strcpy 的报错写了纠错方法。其余的,像是 strncpy,strcat,直接使用它们若是出现了安全版本警告,则解决思路都是设置编译参数,设置方法与 strcpy 的纠错方法是一样的。
使用 strncpy,你需要考虑报错的问题。而使用 lstrcpyn 的话,你不需要考虑设置编译参数的问题,直接使用,Visual Studio 也不会报错的。
这个 lstrcpyn,它的功能与 _tcsncpy 是类似的。当定义了 UNICODE 标识符的时候,lstrcpyn 就是 Unicode 版的字符串函数, lstrcpynW 。如果没有定义 UNICODE 标识符,则 lstrcpy 就是 ASCII 版的字符串函数, lstrcpynA 。lstrcpynW 约等于 wcsncpy,lstrcpyA 约等于 strncpy 。
(四)strcat 的 WIndows 兼容版字符串函数
strcat 的 WIndows 兼容版字符串函数为 lstrcat 。使用方法如下。
pString = lstrcat(pString1, pString2);
lstrcat 的第一个参数及其返回值,都是【TCHAR *】类型的。而第二个参数是【const TCHAR *】类型的。换一个说法,lstrcat 的第一个参数及其返回值的类型为 LPTSTR,lstrcpy 的第二个参数的类型为 LPCTSTR 。
TCHAR,LPTSTR,LPCTSTR 的含义,请参阅下述文章链接。
参考课节:第2章 :Windows 字符数据类型
在上面的示例代码中,lstrcat 的执行效果是,将 pString2 字符串拼接到 pString1 所指向的字符指传的后面。返回值为 pString1,这个返回值被赋值给了 pString 变量。
lstrcat 的使用方法与 strcat 是一样的。strcat 的使用方法,请参考下述文章链接。
参考课节:编程技能:字符串函数06,strcat
lstrcat 虽说与 strcat 的使用方法相同,但是呢,在 Visual Studio 的环境里,存在着一点小的区别。那就是,默认情况下,你直接使用 strcat,则 Visual Studio 会报错,它会建议你使用安全版本的 strcat_s 函数。如果你还是想要使用 strcat 函数,你需要去设置一下编译参数。设置方法,请参考下面的文章链接。
编程技能:字符串函数04,直接使用 strcpy,解决报错
这个参考链接,你没有看错。我只给 strcpy 的报错写了纠错方法。其余的,像是 strncpy,strcat,直接使用它们若是出现了安全版本警告,则解决思路都是设置编译参数,设置方法与 strcpy 的纠错方法是一样的。
使用 strcat 函数,你需要考虑报错的问题。而使用 lstrcat 的话,你不需要考虑设置编译参数的问题,直接使用,Visual Studio 也不会报错的。
这个 lstrcat,它的功能与 _tcscat 是类似的。当定义了 UNICODE 标识符的时候,lstrcat 就是 Unicode 版的字符串函数, lstrcatW 。如果没有定义 UNICODE 标识符,则 lstrcat 就是 ASCII 版的字符串函数, lstrcatA 。lstrcatW 约等于 wcscat,lstrcatA 约等于 strcat 。
(五)strcmp 的 WIndows 兼容版字符串函数
strcmp 的 WIndows 兼容版字符串函数为 lstrcmp 。使用方法如下。
nComp = lstrcmp(pString1, pString2);
lstrcmp 的返回值为 int 类型,第一个参数和第二个参数均为【const TCHAR *】类型。【const TCHAR *】类型与 LPCTSTR 类型同义。
TCHAR,LPTSTR,LPCTSTR 的含义,请参阅下述文章链接。
参考课节:第2章 :Windows 字符数据类型
lstrcmp 的使用方法与 strcmp 是一样的。strcmp 的使用方法,请参考下述文章链接。
参考课节:编程技能:字符串函数08,strcmp
这个 lstrcmp,它的功能与 _tcscmp 是类似的。当定义了 UNICODE 标识符的时候,lstrcmp 就是 Unicode 版的字符串函数, lstrcmpW 。如果没有定义 UNICODE 标识符,则 lstrcmp 就是 ASCII 版的字符串函数, lstrcmpA 。lstrcmpW 约等于 wcscmp,lstrcmpA 约等于 strcmp 。
(六)strcmpi 及其 Windows 兼容版函数
strcmpi 函数,在预备章节里面,我并未讲它。
strcmpi 函数,与 strcmp 函数相似,都是用于字符串比较。两个函数的返回值,参数类型和参数个数都是相同的。不同的地方在于,strcmp 会区分大小写,而 strcmpi 执行不区分大小写的字符串比较。
strcmpi 的 Windows 兼容版函数为 lstrcmpi 。使用方法如下。
nComp = lstrcmpi(pString1, pString2);
本函数与上面的 (五)分节中的 lstrcmp 是非常相似的。只是本函数的比较不区分大小写。请大家参考 lstrcmp 的讲解,自行脑补 lstrcmpi 的用法与要领。
二. 列表总结
上面的内容挺多的,也挺繁琐的。
我们列一个表格,大家大致地梳理一下。
ASCII 版 | Unicode 版 | 兼容版 |
lstrlenA | lstrlenW | lstrlen |
lstrcpyA | lstrcpyW | lstrcpy |
lstrcpynA | lstrcpynW | lstrcpyn |
lstrcatA | lstrcatW | lstrcat |
lstrcmpA | lstrcmpW | lstrcmp |
lstrcmpiA | lstrcmpiW | lstrcmpi |
带有英文字母 L 的对应小写字母,l 前缀的几个字符串函数,它们与带有 _tcs 前缀的对应的字符串函数的功能类似。lstrlen 与 _tcslen 类似,lstrcat 与 _tcscat 类似,等等。
到了这里,本节也就差不多了。
结束语
在写作本节之前,我以为,本节应该不会耗时太多。
可是,真的去写的时候,才发现,写起来,还是比较耗费时间的。
有的函数,还需要我亲自到 VS2019 里面去测试,需要去联机查询 MSDN 的内容。
Windows 程序设计,写起来,也还是有挑战性的。
希望我能够写好本专栏。写好的一大标志是,各位读者在看本专栏的内容时,能够看得懂,学得会。
我们都加油吧。
专栏导航
上一篇:第2章 :兼容 ASCII 字符与宽字符的 Windows 函数调用
回到目录
下一篇:无