实战c++中的string系列--CDuiString和string的转换(duilib中的cduistring)

使用所duilib的人定会知道cduistring类型,先看看这个类是怎么定义的:

class UILIB_API CDuiString
    {
    public:
        enum { MAX_LOCAL_STRING_LEN = 127/*63*/ };

        CDuiString();
        CDuiString(const TCHAR ch);
        CDuiString(const CDuiString& src);
        CDuiString(LPCTSTR lpsz, int nLen = -1);
        ~CDuiString();

        void Empty();
        int GetLength() const;
        bool IsEmpty() const;
        TCHAR GetAt(int nIndex) const;
        void Append(LPCTSTR pstr);
        void Assign(LPCTSTR pstr, int nLength = -1);
        LPCTSTR GetData() const;

        void SetAt(int nIndex, TCHAR ch);
        operator LPCTSTR() const;

        TCHAR operator[] (int nIndex) const;
        const CDuiString& operator=(const CDuiString& src);
        const CDuiString& operator=(const TCHAR ch);
        const CDuiString& operator=(LPCTSTR pstr);
#ifdef _UNICODE
        const CDuiString& CDuiString::operator=(LPCSTR lpStr);
        const CDuiString& CDuiString::operator+=(LPCSTR lpStr);
#else
        const CDuiString& CDuiString::operator=(LPCWSTR lpwStr);
        const CDuiString& CDuiString::operator+=(LPCWSTR lpwStr);
#endif
        CDuiString operator+(const CDuiString& src) const;
        CDuiString operator+(LPCTSTR pstr) const;
        const CDuiString& operator+=(const CDuiString& src);
        const CDuiString& operator+=(LPCTSTR pstr);
        const CDuiString& operator+=(const TCHAR ch);

        bool operator == (LPCTSTR str) const;
        bool operator != (LPCTSTR str) const;
        bool operator <= (LPCTSTR str) const;
        bool operator <  (LPCTSTR str) const;
        bool operator >= (LPCTSTR str) const;
        bool operator >  (LPCTSTR str) const;

        int Compare(LPCTSTR pstr) const;
        int CompareNoCase(LPCTSTR pstr) const;

        void MakeUpper();
        void MakeLower();

        CDuiString Left(int nLength) const;
        CDuiString Mid(int iPos, int nLength = -1) const;
        CDuiString Right(int nLength) const;

        int Find(TCHAR ch, int iPos = 0) const;
        int Find(LPCTSTR pstr, int iPos = 0) const;
        int ReverseFind(TCHAR ch) const;
        int Replace(LPCTSTR pstrFrom, LPCTSTR pstrTo);

        int __cdecl Format(LPCTSTR pstrFormat, ...);
        int __cdecl SmallFormat(LPCTSTR pstrFormat, ...);

    protected:
        LPTSTR m_pstr;
        TCHAR m_szBuffer[MAX_LOCAL_STRING_LEN + 1];
    };

以下用法:

1 Append(LPCTSTR str) 在原字符串基础上追加一个字符串;
CDuiString  dui_str;
dui_str.Append(_T("我是中国人。"));
dui_str.Append(_T("我爱中国!"));     

2 Assign(LPCSTR pstr ,int nLength ) 在pstr字符串的nLength位置后的东西所有剪切掉不要。   config.Assign(config, config.GetLength()-1);   

3 Format(LPCSTR pstrformat, ...); 依照pstrformat字符串的格式,导入其它类型变量
CDuiString folde_path;   folde_path.Format(_T("%ls"), std_string); 

4 GetLength()採集一个变量的宽度(大小);
config.GetLength();

非常多时候 难免用到CDuiString和string的转换。

我们应该注意到,CDuiString类有个方法:

LPCTSTR GetData() const;

能够通过这种方法。把CDuiString变为LPCTSTR ;

所以下一步仅仅是怎样把LPCTSTR 转为string了。

首先写一个StringFromLPCTSTR函数,完毕转换:

std::string StringFromLPCTSTR(LPCTSTR str) {
#ifdef _UNICODE
    int size_str = WideCharToMultiByte(CP_UTF8, 0, str, -1, 0, 0, NULL, NULL);

    char* point_new_array = new char[size_str];

    WideCharToMultiByte(CP_UTF8, 0, str, -1, point_new_array, size_str, NULL, NULL);

    std::string return_string(point_new_array);
    delete[] point_new_array;
    point_new_array = NULL;
    return return_string;
#else
    return std::string(str);
#endif
}

以下就能够完毕duicstring到string的转换了:

CDuiString download_link = msg.pSender->GetUserData();
std::string download_link_str = StringFromLPCTSTR(download_link.GetData());
时间: 2024-10-11 00:36:47

实战c++中的string系列--CDuiString和string的转换(duilib中的cduistring)的相关文章

实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)

string.vector 互转 string 转 vector vector  vcBuf;string        stBuf("Hello DaMao!!!");----------------------------------------------vcBuf.resize(stBuf.size());vcBuf.assign(stBuf.begin(), stBuf.end()); vector 转 string  stBuf.clear();stBuf.assign(v

实战c++中的string系列--string的分割、替换(类似string.split或是explode())

对一个字符串根据某个字符进行分割也是在实战中经常遇到的问题,也是面试中经常会被人提及的. 如果你是个C Sharp程序员,你会知晓string.split函数,有下面这些重载: 1) public string[] Split(params char[] separator) 2) public string[] Split(char[] separator, int count) 3) public string[] Split(char[] separator, StringSplitOpt

实战c++中的vector系列--使用sort算法对vector&lt;unique_ptr&lt;string&gt;&gt;进行排序(sort函数出错“应输入 2 个参数,却提供了 3 个)

之前博客写了对vector使用sort算法进行的排序,之前也写到过vector<unique_ptr<string>>的一些处理方法. 今天就写一下对vector<unique_ptr<string>>使用sort算法进行排序. #include<iostream> #include<string> #include<vector> #include<algorithm> #include<memory&

实战c++中的string系列--string与char*、const char *的转换(data() or c_str())

在project中,我们也有非常多时候用到string与char*之间的转换,这里有个一我们之前提到的函数 c_str(),看看这个原型: const char *c_str(); c_str()函数返回一个指向正规C字符串的指针, 内容与本string串同样. 这就看到了吧,返回值是const char*,这里须要注意一下. 1 string转const char* 当然是用到上面所述的方法c_str(): string s1 = "abcdeg"; const char *k =

实战c++中的string系列--string的替换、查找(一些与路径相关的操作)

今天继续写一些string操作. string给我们提供了很多的方法,但是每在使用的时候,就要费些周折. 场景1: 得到一个std::string full_path = "D:\program files\csdn",但是我想得到"D:\program files\vagaa"这个路径. 这就需要字符串的替换 std::string full_path = "D:\\program files\\csdn" const size_t last_

实战c++中的string系列--string的连接(+= or append or push_back)

string的连接也是经常用到的,string重载了一些运算符: 首先看一看重载+运算符,用于串联两个字符串对象: 源码: template<class CharType, class Traits, class Allocator> basic_string<CharType, Traits, Allocator> operator+( const basic_string<CharType, Traits, Allocator>& _Left, const

广告行业中那些趣事系列2:BERT实战NLP文本分类任务(附github源码)

摘要:上一篇广告中那些趣事系列1:广告统一兴趣建模流程,我们了解了如何为广告主圈人群以及如何刻画用户的兴趣度.要想给用户打标签,我们需要构建数据源和标签的关联,也就是item-tag.针对数量较少的app数据源我们可以使用人工打标的方式来识别,但是对于news.用户query等数量较多的数据源则需要通过机器学习模型来进行打标.实际项目中我们使用NLP中鼎鼎大名的BERT模型来进行文本分类. 通过本篇学习,小伙伴们可以迅速上手BERT模型用于文本分类任务.对数据挖掘.数据分析和自然语言处理感兴趣的

java高并发系列 - 第32天:高并发中计数器的实现方式有哪些?

这是java高并发系列第32篇文章. java环境:jdk1.8. 本文主要内容 4种方式实现计数器功能,对比其性能 介绍LongAdder 介绍LongAccumulator 需求:一个jvm中实现一个计数器功能,需保证多线程情况下数据正确性. 我们来模拟50个线程,每个线程对计数器递增100万次,最终结果应该是5000万. 我们使用4种方式实现,看一下其性能,然后引出为什么需要使用LongAdder.LongAccumulator. 方式一:synchronized方式实现 package

实战SpringCloud响应式微服务系列教程(第六章)

本章节介绍:Flux和Mono操作符 和其他主流的响应式编程一样,Reactor框架的设计目标也是为了简化相应式流的使用方法.为此Reactor框架提供了大量操作符用于操作Flux和Mono对象. 本节不打算全面详细介绍,我们的思路是将这些操作符分类,然后对每一类中具有代表性的操作符展开讨论. 对于其他没有介绍到的操作符可参考Reactor框架的官方文档. 在本节中我们把Flux和Mono操作符分为以下7大类. 转换 (Transforming)操作符负责对序列中的元素进行转变. 过滤 (Fil