C++編程數據類型轉換遇到問題總結 ,持續更新

C++ 字符集unicode和多字節的數據類型差別很大,搞這個費了好長的功夫。就把過程中遇到的問題記錄下,大都是網上找的,鏈接太多七七八八也不好貼是哪位博主了,主要方便自己查閱,投個原創請見諒

1. const char* 字符串 以 “\0”結尾。

2. char[] 字符串 以 “\0”結尾。

3.string 字符串 不以 “\0”結尾。

4. char[n] = "string", 當string 長度+“\0”>n時,會因空間不足出錯。

5.string.c_str() 轉 const char* 時, 會在字符串末尾 自動補“\0”

6.char* 轉string 時, 會自動把末尾的 “\0” 去掉。

7.strlen()是取字符串除去結尾符 “\0” 的長度。

8.sizeof()是包含‘\0’的長度

9.帶有‘\0’和不帶有‘\0’的兩個字符串是無法相等的。
 

1.const char * 轉 wchar_t*類型:

    //const char*轉wchar_t*
    wchar_t* charToWChart(const char *str)
    {
        int length = strlen(str)+1;
        wchar_t *t = (wchar_t*)malloc(sizeof(wchar_t)*length);
        memset(t,0,length*sizeof(wchar_t));
        MultiByteToWideChar(CP_ACP,0,str,strlen(str),t,length);
        return t;
    }

2.std::string字符串替換

    //替換字符串
    //@param: pszSrc:原先字符串
    //@param: pszOld:需要替換的字符串
    //@param: pszNew:替換的新字符串
    //@return:替換完成的字符串
    static std::string replace_str(const char *pszSrc, const char *pszOld, const char *pszNew)
    {
        std::string strContent, strTemp;
        strContent.assign( pszSrc );
        std::string::size_type nPos = 0;
        while( true )
        {
            nPos = strContent.find(pszOld, nPos);
            strTemp = strContent.substr(nPos+strlen(pszOld), strContent.length());
            if ( nPos == std::string::npos )
            {
                break;
            }
            strContent.replace(nPos,strContent.length(), pszNew );
            strContent.append(strTemp);
            nPos +=strlen(pszNew) - strlen(pszOld)+1; //防止重複替換 避免死循環
        }
        return strContent;
    }

3.char*轉std::wstring

    std::wstring charToWstring(char* szIn)
    {
        int length = MultiByteToWideChar(CP_ACP, 0, szIn, -1, NULL, 0);
        WCHAR* buf = new WCHAR[length+1];
        ZeroMemory(buf, (length + 1) * sizeof(WCHAR));
        MultiByteToWideChar(CP_ACP, 0, szIn, -1, buf, length);
        std::wstring strRet(buf);
        delete[] buf;
        return strRet;
    }

4.wchar_t*轉std::string

    std::string w2a(wchar_t* szIn)
    {
        int nSize = WideCharToMultiByte(CP_ACP, 0, szIn, -1, NULL, NULL, NULL, NULL);
        char* buffer = new char[nSize+1];
        ZeroMemory(buffer,nSize+1);
        WideCharToMultiByte(CP_ACP, 0, szIn, -1, buffer, nSize, NULL, NULL);
        std::string strRet(buffer);
        delete[] buffer;
        return strRet;
    }

5.std::string判斷結尾是否包含某字符:

    //判斷字符串結尾是否包含某字符;
    //[in]s:字符串,[in]sub:包含字符
    //return:1:包含 0:包含
    bool endsWith(std::string s, std::string sub) {
        return s.rfind(sub) == (s.length() - sub.length()) ? true : false;
    }

6.分割字符串

    //分割字符串
    std::vector<std::string> split_str(std::string str, std::string pat)
    {
        std::vector<std::string> bufStr;
        while (true)
        {
            int index = str.find(pat);
            std::string subStr = str.substr(0, index);
            if (!subStr.empty())
                bufStr.push_back(subStr);
     
            str.erase(0, index + pat.size());
     
            if (index == -1)
                break;
        }
        return bufStr;
    }
 

在字符串無法直接賦值使用_T

CString = _T("test");

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章