比较TCHAR *和来自TCHAR * []的值

时间:2016-02-09 21:33:09

标签: c++ arrays unicode

我在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打印它们时,只有正确显示数组中的已知代码,响应代码与????的

混杂在一起

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

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

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

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

使用我在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;
};