[英]Visual C++, wchar_t* command-line arguments cannot be compared?
我在嘗試根據字符串argv [1]等於實現某個賦值時遇到了一些麻煩。
int _tmain(int argc, _TCHAR* argv[]) //wchar_t
{
if (argc != 2)
exit(1);
if (argv[1] == L"-foo")
printf("Success!\n");
wprintf(argv[1]);
printf("\n");
system("pause");
return 0;
}
如果我使用參數“-foo”運行可執行文件,我會收到以下輸出:
-foo
它應該是:
Success!
-foo
字符串正是我想要的,但if條件仍然是假的。 wchar_t
字符串是否使用==
運算符無法比較? 如果是這樣,我該如何正確比較它們?
初步注意 :本答案中的Unicode和Unicode字符 ,根據問題本身的上下文,是指UCS-2(最高為XP)和UTF-16(以XP開頭)編碼,可與寬字符
wchar_t
,WCHAR
互換使用和Win32 API上下文中的其他術語。 Unicode標准提供多種編碼,如UTF-8,UTF-16和UTF-32,以編碼相同數量的字符 - 標准的不同版本具有不同的范圍。 代理代碼點用於從基本多語言平面(BMP)中逃逸,大致是第一個64K代碼點,因此編碼比用16位字符和每個代碼點一個字符編碼更多。 代理擴展是為Unicode 2.0標准開發的,該標准在NT 4.0發布的年份通過,但是在第一個“支持Unicode的”版本的NT NT 3.51發布之后幾年。 原始標准沒有考慮比BMP更多的字符,這就是為什么Unicode字符或寬字符現在甚至在Win32 API上下文中與Unicode同義,盡管這是不准確的。
要回答你提出的基本問題:
wchar_t
字符串是否使用“==”運算符無法比較?
不,它們不是,也不是“ANSI”字符串,即使用char
類型作為基礎。 請記住,C字符串(基於wchar_t
和char
) 都是指針 。 這意味着==
你正在比較兩個絕對不相等的指針值。 畢竟,一個是文字字符串(即在程序圖像中),而另一個是在堆上的某個地方分配的。 所以他們肯定是兩個不同的實體。
如果你想使用==
你必須使用C ++等語言與STL類std::string
(或std::basic_string<_TCHAR>
)或(在Windows上)ATL類CString
(或更確切地說是CStringT
) 。 這些類有時被稱為智能字符串類,並使用覆蓋operator==()
的C ++工具。 但是,您應該記住語義因實現而異,因此並非每個智能字符串類都會比較字符串內容。 有些人可能僅僅比較平等this
(即是相同的實例),而另一些可能比較字符串內容不區分大小寫或者區分大小寫自行決定。
要比較C字符串,您可以使用以下函數用於您的用例:
char
)字符串: strcmp
, _stricmp
(以及“計數”變體: _strncmp
, _strnicmp
......還有更多) wchar_t
)字符串: wcscmp
, _wcsicmp
(以及“計數”變體: _wcsncmp
, _wcsnicmp
......還有更多) TCHAR
)字符串: _tcscmp
, _tcsicmp
(和“計數”變體: _tcsncmp
, _tcsnicmp
......還有更多) 你可以記住這些前綴:
str
- > string wcs
- >寬字符串 tcs
- > T字符串 附注:使用#include <tchar.h>
和windows.h
,宏TEXT
和_T
是等效的,用於聲明字符串文字,根據構建時的定義,它將是“ANSI”或Unicode。 這同樣適用於_TCHAR
和TCHAR
顯然,而后者出現在Win32 API的上下文受到青睞。
因此,Unicode構建將_T("something")
擴展為L"something"
,而“ANSI”構建則將其擴展為"something"
。
至於TCHAR,請考慮閱讀以下論點: TCHAR是否仍然相關? (通過指出rubenvb )有支持和反對的有效點TCHAR
/ _TCHAR
使用,你應該做出決定,並堅持使用它-即是一致的 。
沒關系,明白了。
if (wcscmp(argv[1], L"-foo") == 0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.