为什么使用wchar_t时两个内容相同的字符串不同?
我正在写一个代码,用于比较LPSTR和wchar_t类型的两个字符串。字符串的内容相同,但输出显示字符串不同。以下是完整代码的截图。为什么使用wchar_t时两个内容相同的字符串不同?
#include <iostream>
#include <string.h>
#include <wtypes.h>
using namespace std;
int main(int argc, char** argv)
{
LPSTR str1= "Abcdef123456";
wchar_t *str2 = L"Abcdef123456";
if(!strcmp((char *)str1, (char *)str2))
{
cout<<"same";
}
else
{
cout<<"diff";
}
return 0;
}
执行时,输出是diff。我认为输出应该是一样的。请帮忙。
L'A'
在内存中的表示方式不同于'A'
。如果您假装wchar_t
的数组是char
(通过显式转换char*
)的数组并将其与具有不同表示的另一个char
数组进行比较,则它们将比较不同的表示。
输出如预期。
比较字符串的正确方法是将窄字符串转换为宽字符串。这不完全是微不足道做正确,所以这里有一个例子:
auto length = std::strlen(str1);
std::wstring temp(length, L'\0');
std::mbstowcs(&temp[0], str1, length);
if (!wcscmp(temp.c_str(), str2))
// ...
谢谢@ user2079303的解决方案,这对我很有用。请也解释一下'wstring temp(length,L'\ 0')'在这里做什么。 – akashagrawal
@akashagrawal它为窄字符串转换成的缓冲区构造一个宽字符串对象。 – user2079303
嘿,非常感谢你@ user2079303。该代码的作品,但现在的问题是,在调试时,悬停在'str2'显示字符串值,而悬停在'c_str()'不显示字符串的值。另外,由于这个原因,条件部分工作不正常。请帮助我。 – akashagrawal
为什么你觉得他们应该是一样的吗? – DeiDei
您对'strcmp'的调用是比较单字节字符。第一个字符串由单字节字符组成,是第二个宽度为2个字节的字符。它们不是同一件事。在进行比较之前,您需要将字符串转换为相同的存储格式。 – Baldrick
如果''A“'和'L”A“'是一样的,为什么我们需要两个版本? –