Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在使用wchar\u t时具有相同内容的两个字符串不同?_C++_String_Wchar T_Lpstr - Fatal编程技术网

C++ 为什么在使用wchar\u t时具有相同内容的两个字符串不同?

C++ 为什么在使用wchar\u t时具有相同内容的两个字符串不同?,c++,string,wchar-t,lpstr,C++,String,Wchar T,Lpstr,我正在编写一个代码,用于比较LPSTR类型和wchar_t类型的两个字符串。字符串的内容相同,但输出显示字符串不同。下面是完整代码的屏幕截图 #include <iostream> #include <string.h> #include <wtypes.h> using namespace std; int main(int argc, char** argv) { LPSTR str1= "Abcdef123456"; wchar_t *

我正在编写一个代码,用于比较LPSTR类型和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;
}
在执行时,输出是不同的。我认为输出应该是相同的。请帮忙

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

为什么您认为它们应该是相同的?您对TRCMP的调用是比较单字节字符。第一个字符串由单字节字符组成,第二个字符串由宽2字节字符组成。它们不是一回事。在进行比较之前,您需要将字符串转换为相同的存储格式。如果A和LA是相同的,为什么我们需要两个版本?@DeiDei我认为既然内容相同,字符串应该是相同的。但现在我知道了这两种strorage类型之间的区别。感谢@Baldrick的清晰解释。感谢@User207933的解决方案,这对我很有用。还请解释一下wstring templength,L'\0'在这里的作用。@akashagrawal它为窄字符串转换成的缓冲区构造了一个宽字符串对象。嘿,非常感谢@user207933。代码可以工作,但现在的问题是,在调试时,将鼠标悬停在str2上会显示字符串值,而将鼠标悬停在c_str上不会显示字符串值。此外,由于这个原因,条件部分不能正常工作。“请帮我解决这个问题。”阿卡沙格拉沃我原来用错了长度。现在应该解决这个问题了。如果希望在调试器中查看字符串对象的内容,应联系调试器提供商的销售团队。