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");

下面常见错误

char *getstr1()
{
	char s[]="str1";
	return s;
}
 
int main()
{
    char* s1;
    s1 = getstr1();
    printf("%s",s1);
    return 0;
}

程序报错
warning: address of local variable ‘s’ returned [-Wreturn-local-addr]
char s[]=“str1”;
原因:在函数内部定义变量,并返回

这样函数内部定义的变量在函数结束时被释放掉,所以返回是找不到的。

改为

static char s[]=“str1”;就不会了,警告消除
 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值