2017-03-08 67 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

相關問題