Visual C ++,wchar_t *命令行参数无法比较?

时间:2012-07-11 16:42:51

标签: c++ visual-c++ if-statement comparison wchar-t

我在尝试根据字符串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运算符,==字符串是否无法比较?如果是这样,我该如何正确比较它们?

2 个答案:

答案 0 :(得分:4)

  

初步注意事项Unicode Unicode字符在此答案中,考虑到问题本身的上下文,指的是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的”版本的Windows NT 3.51之后,已经发布。原始标准没有比BMP更多的字符,这就是为什么 Unicode字符宽字符现在甚至与<在Win32 API上下文中使用em> Unicode ,虽然这是不准确的。

回答你提出的基本问题:

  

使用wchar_t字符串无法比较   “==”运算符?

不,它们不是,也不是“ANSI”字符串,即使用char类型作为基础。请记住,C字符串(基于wchar_tchar是指针。这意味着使用==比较两个绝对不相等的指针值。毕竟,一个是文字字符串(即在程序图像中),而另一个是在堆上的某个地方分配的。所以他们肯定是两个不同的实体。

如果您想使用==,则必须使用C ++等语言与STL类std::string(或std::basic_string<_TCHAR>)或(在Windows上)ATL类{ {1}}(或更确切地说是CString)。这些类有时被称为智能字符串类,并使用覆盖CStringT的C ++工具。但是,您应该记住语义因实现而异,因此并非每个智能字符串类都会比较字符串内容。有些人可能只是比较operator==()的相等性(即它是同一个实例),而其他人可能会根据自己的判断比较不区分大小写或区分大小写的字符串内容。

要比较C字符串,您可以使用以下函数:

  • 对于“ANSI”字符(this)字符串:charstrcmp(和“计数”变体:_stricmp_strncmp ...还有更多)
  • 对于Unicode字符(_strnicmp)字符串:wchar_twcscmp(和“计数”变体:_wcsicmp_wcsncmp ...更多)
  • 对于变量字符“type”(_wcsnicmp)字符串:TCHAR_tcscmp(以及“计数”变体:_tcsicmp_tcsncmp。 ..还有更多)

你可以记住这些前缀:

  • _tcsnicmp - &gt;串
  • str - &gt;宽字符串
  • wcs - &gt; T字符串

附注:使用tcs#include <tchar.h>,宏windows.hTEXT是等效的,用于声明字符串文字,该字符串文字将取决于“ANSI”或Unicode在构建时的定义。同样适用于_T_TCHAR,而后者似乎在Win32 API上下文中受到青睐。

因此,Unicode构建会将TCHAR扩展为_T("something"),而“ANSI”构建会将其扩展为L"something"

关于TCHAR,请考虑阅读以下内容中提出的论点:Is TCHAR still relevant?(由rubenvb指出)对"something" / TCHAR使用有效和反对的要点你应该做出决定并坚持下去 - 即保持一致

答案 1 :(得分:0)

没关系,明白了。

if (wcscmp(argv[1], L"-foo") == 0)