專欄導航
上一篇:第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 函數調用
回到目錄
下一篇:無