2017-03-08 168 views
-3

我正在写一个代码,用于比较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。我认为输出应该是一样的。请帮忙。

+0

为什么你觉得他们应该是一样的吗? – DeiDei

+3

您对'strcmp'的调用是比较单字节字符。第一个字符串由单字节字符组成,是第二个宽度为2个字节的字符。它们不是同一件事。在进行比较之前,您需要将字符串转换为相同的存储格式。 – Baldrick

+2

如果''A“'和'L”A“'是一样的,为什么我们需要两个版本? –

回答

1

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)) 
    // ... 
+0

谢谢@ user2079303的解决方案,这对我很有用。请也解释一下'wstring temp(length,L'\ 0')'在这里做什么。 – akashagrawal

+0

@akashagrawal它为窄字符串转换成的缓冲区构造一个宽字符串对象。 – user2079303

+0

嘿,非常感谢你@ user2079303。该代码的作品,但现在的问题是,在调试时,悬停在'str2'显示字符串值,而悬停在'c_str()'不显示字符串的值。另外,由于这个原因,条件部分工作不正常。请帮助我。 – akashagrawal