【问题标题】:compare TCHAR* and values from a TCHAR* []比较 TCHAR* 和 TCHAR* [] 中的值
【发布时间】:2016-02-09 21:33:09
【问题描述】:

我在 C++ 中正确使用 TCHAR 和 _T() 时遇到问题。宽/窄字符表示的差异正在发生一些奇怪的事情

我有来自服务器的响应,它只是一个表示为 TCHAR* 的字符串

TCHAR * response = getTheResponseFromTheServer();

我想将此值与可能值的数组进行比较,看看它们是否匹配。我已经这样定义了数组:

TCHAR * knownCodes[] = {_T("appleCode"), _T("pearCode"), _T("grapeCode")};

但由于某种原因,当我使用 tcsmpr 比较数组中的值和响应时,它们不相等

_tcscmp(response, KnownProductCodes[i]) //this never returns 0; they are not equal even when i know they are

当我用 %s 将它们都打印出来时,只有数组中的已知代码正确显示,响应代码与 ????'s 混淆

当我用 %hs 打印它们时,响应代码显示正确,并且只显示 knownCodes[i] 的第一个字母。 (a、p 或 g)

正确打印时,它们都打印相同的字符串“appleCode”

显然我对 char 和 wchar 之间的区别或如何使用数组有某种错误信息。

任何帮助将不胜感激。

【问题讨论】:

  • 你真的应该展示getTheResponseFromTheServer函数的作用。也许您正在返回一个指向存储在堆栈上的缓冲区的指针。
  • 我实际上没有那个代码。我想知道为什么你认为它是相关的?我知道响应中有正确的字符串。我可以打印出来,它是正确的。只是已知代码与响应的字符格式不同。
  • 在这种情况下,你确定它返回一个wchar_t*吗? TCHAR 的问题在于它是一个改变类型大小的宏,具体取决于编译时指定的选项。如果您要链接到某个库,则可能是该库的TCHAR 实际上是char,而您的编译为wchar_t。您应该打开all编译器警告并检查是否有针对TCHAR * response = getTheResponseFromTheServer();的警告生成
  • 您也可以试试这个(如果您的编译器支持 C++11 或更高版本):auto response = getTheResponseFromTheServer(); static_assert( sizeof(*response) == sizeof(TCHAR), "TCHAR strikes again" );
  • 感谢您在这里帮助我。我会尝试找出是否有任何警告。让我们假设响应实际上以 char* 而不是 wchar_t* 的形式返回。不应该进行简单的转换吗?

标签: c++ arrays unicode


【解决方案1】:

使用我用 C 语言编写的这个快速函数来调试您的问题。注意:它并不完美,可能有错误,但希望能帮助您找出问题所在。它假定第一个字符(如果它是 wchar_t)不使用第二个字节,如果它是来自 'a' => 'z'、'0' => '9' 的字母,则会发生这种情况 你可以像这样使用它:

quick_debugger((wchar_t*)response, (wchar_t*)knownCodes[i]);

int quick_debugger(wchar_t *a, wchar_t *b)
{
    int w = 1;
    size_t a_len, b_len;

    if (((char*)a)[1] != 0)
    {
        if (((char*)b)[1] == 0)
        {
            wprintf(L"error: response is char*, but knownCodes is wchar_t*\n");
            return 1;
        }

        printf("comparing char* strings (%s, %s)\n", (char*)a, (char*)b);
        a_len = strlen((char*)a), b_len = strlen((char*)b);
    }
    else if (((char*)b)[1] != 0)
    {
        wprintf(L"error: response is wchar_t*, but knownCodes is char*\n");
        return 2;
    }
    else
    {
        wprintf(L"comparing wchar_t* strings (%s, %s)\n", a, b);
        a_len = wcslen(a), b_len = wcslen(b);
        w = 2;      
    }

    if (a_len != b_len)
    {
        wprintf(L"length is not the same (%d, %d)", a_len, b_len);
        return 3;
    }

    for (size_t i = 0; i < (a_len * w); i++)
    {
        if (((char*)a)[i] != ((char*)b)[i])
        {
            printf("characters at pos %d dont match: %c != %c", (i / w), ((char*)a)[i], ((char*)b)[i]); 
            return 4;
        }
    }

    wprintf(L"quick_debugger: strings match\n");
    return 0;
};

【讨论】:

  • 谢谢。明天早上我将测试第一件事。我将不得不修改打印错误的位置,但我应该能够使用它。
  • 我实际上已经让它工作了。这个函数很有帮助,因为它帮助我查看了数据可能采用哪种格式的所有可能性。所以基本上:服务器显然总是返回窄字符。所以我只是使用 _snprintf_s 为已知代码(在数组中)写入分配的 char* 指针,然后在比较时将 TCHAR* 响应转换为 char*,现在使用 strcmp()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多