我在尝试根据字符串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
运算符,==
字符串是否无法比较?如果是这样,我该如何正确比较它们?
答案 0 :(得分:4)
初步注意事项: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的”版本的Windows NT 3.51之后,已经发布。原始标准没有比BMP更多的字符,这就是为什么 Unicode字符或宽字符现在甚至与<在Win32 API上下文中使用em> Unicode ,虽然这是不准确的。
回答你提出的基本问题:
使用
wchar_t
字符串无法比较 “==”运算符?
不,它们不是,也不是“ANSI”字符串,即使用char
类型作为基础。请记住,C字符串(基于wchar_t
和char
)是指针。这意味着使用==
比较两个绝对不相等的指针值。毕竟,一个是文字字符串(即在程序图像中),而另一个是在堆上的某个地方分配的。所以他们肯定是两个不同的实体。
如果您想使用==
,则必须使用C ++等语言与STL类std::string
(或std::basic_string<_TCHAR>
)或(在Windows上)ATL类{ {1}}(或更确切地说是CString
)。这些类有时被称为智能字符串类,并使用覆盖CStringT
的C ++工具。但是,您应该记住语义因实现而异,因此并非每个智能字符串类都会比较字符串内容。有些人可能只是比较operator==()
的相等性(即它是同一个实例),而其他人可能会根据自己的判断比较不区分大小写或区分大小写的字符串内容。
要比较C字符串,您可以使用以下函数:
this
)字符串:char
,strcmp
(和“计数”变体:_stricmp
,_strncmp
...还有更多)_strnicmp
)字符串:wchar_t
,wcscmp
(和“计数”变体:_wcsicmp
,_wcsncmp
...更多)_wcsnicmp
)字符串:TCHAR
,_tcscmp
(以及“计数”变体:_tcsicmp
,_tcsncmp
。 ..还有更多)你可以记住这些前缀:
_tcsnicmp
- &gt;串str
- &gt;宽字符串wcs
- &gt; T字符串附注:使用tcs
和#include <tchar.h>
,宏windows.h
和TEXT
是等效的,用于声明字符串文字,该字符串文字将取决于“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)