StrCmpW和wcscmp之间有什么不同?

时间:2015-07-24 02:29:10

标签: linux unicode strcmp qsort wstring

实际上我把代码更改为下一个。

struct myclass {
    bool operator() (std::wstring p1, std::wstring p2) {
        int result = 0;
        //// If character is alphabet, sorting need converse.
        wint_t a1 = p1.at(0);
        wint_t b2 = p2.at(0);
        int r1 = iswalpha(a1);
        int r2 = iswalpha(b2);
        **// return code of iswalpha.
        // 257 is Upper Alphabet, 
        // 258 is Lower Alphabet**
        if ((r1 == 257 && r1 == 258) || 
            (r2 == 258 && r2 == 257)) {
            result = p2.compare(p1);
        }
        else {
            result = p1.compare(p2);
        }   

        if (result != 0) {
            if (result == -1) {
                return true;
            }
            else {
                return false;
            }
        }

        return false;
    }
} wStrCompare;

void main() {
    std::vector<std::wstring> wlist;
    wlist.emplace_back(L"가나");
    wlist.emplace_back(L"123");
    wlist.emplace_back(L"abc");
    wlist.emplace_back(L"타파");
    wlist.emplace_back(L"하하");
    wlist.emplace_back(L"!@#$");
    wlist.emplace_back(L"一二三");
    wlist.emplace_back(L"好好");
    wlist.emplace_back(L"QWERID");
    wlist.emplace_back(L"ⓐⓑ");
    wlist.emplace_back(L"☆★");
    wlist.emplace_back(L"とばす");

    std::sort(wlist.begin(), wlist.end(), wStrCompare);
}

测试结果

L"!@#$"
L"123"
L"abc"
L"QWERID"
L"ⓐⓑ"
L"☆★"
L"とばす"
L"一二三"
L"好好"
L"가나"
L"타파"
L"하하"
这是好事吗? 请给我一些意见。

谢谢!

我改变了我的代码,但我仍然想知道&#34; StrCmpW和wcscmp之间有区别&#34;请跟我说话。谢谢!

旧问题

我使用qsort和std :: wstring(用于unicode字符串),并使用StrCmpW。

以前,我使用StrCmpLogicalW()和CString,CStringArray。 (这取决于窗口)

但我的代码也在linux中运行,不仅仅是在windows中运行。 (CString是ATL(afx),StrCmpLogicalW()在Shlwapi.h中)

所以我使用std :: wstring和wcscmp,但结果不同。

StrCmpW()和wcscmp()之间有区别吗?

以下是我的代码。(完全不是我的lol)

int wCmpName(const void* p1, const void *p2)
{
    std::wstring* wszName1 = ((std::wstring *)(p1));
    std::wstring* wszName2 = ((std::wstring *)(p2));

    int wret = StrCmpW(wszName1->c_str(), wszName2->c_str());
    // int wret = wcscmp(wszName1->c_str(), wszName2->c_str());
    // When i use wcscmp, different result comes out.
    return wret;
}

void wSort(std::vector<std::wstring> &arr)
{
    qsort(arr.data(), arr.size(), sizeof(std::wstring), wCmpName);
}

谢谢!

测试代码

void main() {
    std::vector<std::wstring> wlist;
    wlist.emplace_back(L"가나");
    wlist.emplace_back(L"123");
    wlist.emplace_back(L"abc");
    wlist.emplace_back(L"타파");
    wlist.emplace_back(L"하하");
    wlist.emplace_back(L"!@#$");
    wlist.emplace_back(L"一二三");
    wlist.emplace_back(L"好好");
    wlist.emplace_back(L"QWERID");
    wlist.emplace_back(L"ⓐⓑ");
    wlist.emplace_back(L"☆★");
    wlist.emplace_back(L"とばす");

    wSort(wlist);
}

测试结果

  • wcscmp

    L"!@#$"
    L"123"
    L"QWERID"
    L"abc"
    L"ⓐⓑ"
    L"☆★"
    L"とばす"
    L"一二三"
    L"好好"
    L"가나"
    L"타파"
    L"하하"   
    
  • StrCmpW

    L"!@#$"
    L"☆★"
    L"123"
    L"ⓐⓑ"
    L"abc"
    L"QWERID"
    L"とばす"
    L"가나"
    L"一二三"
    L"타파"
    L"하하"
    L"好好"
    

p.s:为何限制声誉?!有限的图片,有限的网址。       只有文字需要很长时间。

0 个答案:

没有答案