簡體   English   中英

Visual C ++,wchar_t *命令行參數無法比較?

[英]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字符串是否使用==運算符無法比較? 如果是這樣,我該如何正確比較它們?

初步注意 :本答案中的UnicodeUnicode字符 ,根據問題本身的上下文,是指UCS-2(最高為XP)和UTF-16(以XP開頭)編碼,可與寬字符 wchar_tWCHAR互換使用和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_tchar都是指針 這意味着==你正在比較兩個絕對不相等的指針值。 畢竟,一個是文字字符串(即在程序圖像中),而另一個是在堆上的某個地方分配的。 所以他們肯定是兩個不同的實體。

如果你想使用==你必須使用C ++等語言與STL類std::string (或std::basic_string<_TCHAR> )或(在Windows上)ATL類CString (或更確切地說是CStringT ) 。 這些類有時被稱為智能字符串類,並使用覆蓋operator==()的C ++工具。 但是,您應該記住語義因實現而異,因此並非每個智能字符串類都會比較字符串內容。 有些人可能僅僅比較平等this (即是相同的實例),而另一些可能比較字符串內容不區分大小寫或者區分大小寫自行決定。

要比較C字符串,您可以使用以下函數用於您的用例:

  • 對於“ANSI”字符( char )字符串: strcmp_stricmp (以及“計數”變體: _strncmp_strnicmp ......還有更多)
  • 對於Unicode字符( wchar_t )字符串: wcscmp_wcsicmp (以及“計數”變體: _wcsncmp_wcsnicmp ......還有更多)
  • 對於變量字符“type”( TCHAR )字符串: _tcscmp_tcsicmp (和“計數”變體: _tcsncmp_tcsnicmp ......還有更多)

你可以記住這些前綴:

  • str - > string
  • wcs - >寬字符串
  • tcs - > T字符串

附注:使用#include <tchar.h>windows.h ,宏TEXT_T是等效的,用於聲明字符串文字,根據構建時的定義,它將是“ANSI”或Unicode。 這同樣適用於_TCHARTCHAR顯然,而后者出現在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM