2017-03-08 7 views
-3

LPSTR型とwchar_t型の2つの文字列を比較するコードを記述しています。文字列の内容は同じですが、出力は文字列が異なることを示しています。以下は完全なコードのスクリーンショットです。wchar_tの使用中に同じ内容の2つの文字列が異なるのはなぜですか?

#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'を呼び出すと、1バイト文字が比較されます。最初の文字列は1バイト文字で構成され、2番目の文字は2バイト文字です。彼らは同じことではありません。比較を行う前に、ストリングを同じストレージ形式に変換する必要があります。 – Baldrick

+2

'' A ''と' 'L" A "'が同じだった場合、どうして2つのバージョンが必要でしょうか? –

答えて

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

関連する問題