3

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

4

2 回答 2

4

初步说明:鉴于问题本身的上下文,此答案中的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 发布的那一年通过,但在 Windows 的第一个“支持 Unicode”的版本 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)的语言。这些类有时称为智能字符串类,并使用 C++ 工具覆盖operator==(). 但是,您应该记住,语义因实现而异,因此并非每个智能字符串类都会比较字符串内容。有些人可能只比较 的相等性this(即它是否是同一个实例),而另一些人可能会自行比较字符串内容不区分大小写或区分大小写。

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

  • 对于“ANSI”字符 ( char) 字符串:strcmp, _stricmp(以及“计数”变体:_strncmp, _strnicmp... 还有更多)
  • 对于 Unicode 字符 ( wchar_t) 字符串:wcscmp, _wcsicmp(以及“计数”变体:_wcsncmp, _wcsnicmp... 还有更多)
  • 对于变量字符“类型”(TCHAR)字符串: _tcscmp_tcsicmp(和“计数”变体:_tcsncmp_tcsnicmp......还有更多)

你可以记住这些前缀:

  • str-> 字符串
  • wcs-> 宽字符串
  • tcs-> T 字符串

旁注: with#include <tchar.h>windows.hTEXTand_T是等价的,用于声明一个字符串文字,根据构建时的定义,它要么是“ANSI”,要么是 Unicode。显然,这同样适用,_TCHARTCHAR后者似乎在 Win32 API 上下文中受到青睐。

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

至于 TCHAR,请考虑通读以下提出的论点:TCHAR 是否仍然相关?(由rubenvb指出) 有赞成和反对TCHAR/_TCHAR使用的有效观点,您应该做出决定并坚持下去 - 即保持一致

于 2012-07-11T17:21:37.980 回答
0

没关系,明白了。

if (wcscmp(argv[1], L"-foo") == 0)
于 2012-07-11T17:11:18.433 回答