CString,string Char 的转换
2007-05-17 21:41
//*********************************************************************
01.CString      to      char      pointer   
//**********************************************************************
    CString      mystring      =      "abcde";   
    char      *szmystring      =      (char      *)(LPCTSTR)mystring;   
   
    char      *pBuffer      =new      char[1024];   
    CString      strBuf      =      "test";   
    pBuffer      =      strBuf.GetBuffer(sizeof(pBuffer)); 
    &
    pBuffer=strBuf.GetBuffer(strBuf.GetLength);
//*************************************************************
   
    02.char      pointer      to      CString   
//*******************************************************************
        char      *mystring      =      "12345";   
          CString      string      =      mystring;
        string.Format("%s",mystring)
//******************************************************************
03.string CString以及char*
//******************************************************************
string是方便的,可以从几乎所有的字符串构造而来,包括CStringchar*

CString次之,可以从基本的一些字符串变量构造而来,包括char*等;

char*没有构造函数,仅可以赋值;

举例:

char* psz = joise;

CString cstr( psz );

string str( cstr );
string是最方便的,几乎可以直接用所有的字符串赋值,包括CStringchar*

CString次之,可以直接用些基本的字符串赋值,包括char*等;

char*只能由指针赋值,并且是极危险的操作,建议使用strcpy或者memcpy,而且char*在声明的时候如未赋初值建议先设为NULL,以避免野指针,令你抓狂;

举例:

char *psz = NULL;

psz = new char[10]; //当然,以上的直接写成char *psz = new char[10];也是一样

memset( psz, 0, 10 );

strcpy( psz, joise );

CString cstr;

cstr = psz;

string str;

str = psz;

str = cstr;

delete []psz;
stringCString差不多,可以直接与char*进行加法,但不可以相互使用+运算符,即string str = str + cstr是非法的,须转换成char*

char*没有+运算,只能使用strcat把两个指针连在一起;

举例:

char* psz = joise;

CString cstr = psz;

cstr = cstr + psz;

string str = psz;

str = str + str + psz;

strcat( psz, psz );

strcat( psz, cstr );//合法

strcat( psz, str );//非法,由此可见,CString可自动转换为const char*,而string不行
//******************************************************************************************************
//不明白的继续:
//*****************************************************************************************************
CStringchar*的转换
CStringchar*的转换
参见如下代码:
1     int i=m_edit1.GetLength();
2     char* p; 
3     CString hex4="\0";
4     CString hex5="\0";
5     m_edit3.SetSel(0,-1);
6     m_edit3.ReplaceSel("");
7     p=m_edit1.GetBuffer(i);
8     for(int j=0;j<i;j++)  {
9            hex5.Format("%x ",(unsigned char)*p++);
10           hex4+=hex5;
11    }
12    m_edit3.ReplaceSel(hex4);
其中m_edit3是一个CEdit类型的变量,SetSelReplaceSel都是其成员函数,可以参见MSDN
在这里,m_edit1为一个CString类型的变量,p为字符串
这段代码的主要功能是:
CString中的字符串转换成为16进制代码,在放置到字符串输出给用户查看。
主要变化流程 CString->char*->CString->CEdit
A.5612行主要是CEdit中显示CString的操作。
B.7行主要功能是将CString赋值给字符串,即实现CString->char*的转换。
C.1行主要是获得CString中字符串的长度,并不包含’\0’在内。
D.910行,利用CString的成员函数format将字符串中的数据一个个读取出来,并转换成为16进制数加入到CStringcstring转为int中。
E.利用CEdit的成员函数ReplaceSelCString中数据输出。
一个应用:
基于RC4算法的数据加密:
设置如下:
 
输入int类型数据,在下面转换成为16进制数据,代码如下:
void CC_R4Dlg::OnChangeEdit1()
{
       UpdateData(TRUE);
       int i=m_key;
       m_0xkey.Format("0x%x",i);
       UpdateData(FALSE);
}
按钮加密的代码实现如下功能:
将明文的字符串变成16进制放置于明文块2
将密文的字符串放置于密文块2中,16进制放置于密文块2
void CC_R4Dlg::OnOK()
{
       // TODO: Add extra validation here
       int i=m_edit1.GetLength();
       char* p;
       rc4_key key;
    UpdateData(TRUE);
       UpdateData(FALSE);
       //m_edit3
       p=m_edit1.GetBuffer(i);
       CString hex4="\0";
       CString hex5="\0";
       for(int j=0;j<i;j++){
              hex5.Format("%x ",(unsigned char)*p++);
              hex4+=hex5;
       }
       m_edit3.SetSel(0,-1);
       m_edit3.ReplaceSel("");
       m_edit3.ReplaceSel(hex4);
   
    //m_edit2
    p=m_edit1.GetBuffer(i);
    prepare_key((unsigned char*)&m_key,sizeof(int),&key);
       rc4((unsigned char*)p,i,&key);
       CString hex = _T(p);
       CString hex2="\0";
       CString hex3="\0";
    for(j=0;j<i;j++){     
         hex3.Format("%2X ",(unsigned char)*p++);
         hex2+=hex3;
       }
       m_edit2.SetSel(0,-1);
       m_edit2.ReplaceSel("");
       m_edit2.ReplaceSel(hex2);
   
       //m_edit4
       m_edit4.SetSel(0,-1);
       m_edit4.ReplaceSel("");
       m_edit4.ReplaceSel(hex);
CString>TCHAR*的转化可以用函数GetBuff()
函数原型为:LPTSTR GetBuffer( int nMinBufLength );
CString str("CString");
 TCHAR* szMsg = new TCHAR[100];
 //其参数为CString字符串的长度
 szMsg = str.GetBuffer(str.GetLength());
 str.ReleaseBuffer();
 delete []szMsg;
 szMsg = NULL;
TCHAR*>CString的转化
TCHAR szTchar[18] = L"TCHAR"; 
 CString  str; 
 str.Format(_T("%s"),szTchar); 
CString 是对于原来标准c中字符串类型的一种的包装。因为,通过很长时间的编程,我们发现,很多程序的bug多和字符串有关,典型的有:缓冲溢出、内存泄漏等。而 且这些bug都是致命的,会造成系统的瘫痪。因此c++里就专门的做了一个类用来维护字符串指针。标准c++里的字符串类是string,在 microsoft MFC类库中使用的是CString类。通过字符串类,可以大大的避免c中的关于字符串指针的那些问题。
这里我们简单的看看Microsoft MFC中的CString是如何实现的。当然,要看原理,直接把它的代码拿过来分析是最好的。MFC里的关于CString的类的实现大部分在strcore.cpp中。
CString 就是对一个用来存放字符串的缓冲区和对施加于这个字符串的操作封装。也就是说,CString里需要有一个用来存放字符串的缓冲区,并且有一个指针指向该 缓冲区,该指针就是LPTSTR m_pchData但是有些字符串操作会增建或减少字符串的长度,因此为了减少频繁的申请内存或者释放内存,CString会先申请一个大的内存块用来 存放字符串。这样,以后当字符串长度增长时,如果增加的总长度不超过预先申请的内存块的长度,就不用再申请内存。当增加后的字符串长度超过预先申请的内存 时,CString先释放原先的内存,然后再重新申请一个更大的内存块。同样的,当字符串长度减少时,也不释放多出来的内存空间。而是等到积累到一定程度 时,才一次性将多余的内存释放。
还有,当使用一个CString对象a来初始化另一个CString对象b时,为了节省空间,新对象b并不 分配空间,它所要做的只是将自己的指针指向对象a的那块内存空间,只有当需要修改对象a或者b中的字符串时,才会为新对象b申请内存空间,这叫做写入复制 技术(CopyBeforeWrite)
这样,仅仅通过一个指针就不能完整的描述这块内存的具体情况,需要更多的信息来描述。
首先,需要有一个变量来描述当前内存块的总的大小。
其次,需要一个变量来描述当前内存块已经使用的情况。也就是当前字符串的长度
另外,还需要一个变量来描述该内存块被其他CString引用的情况。有一个对象引用该内存块,就将该数值加一。
CString中专门定义了一个结构体来描述这些信息:
struct CStringData
{
long nRefs;            // reference count
int nDataLength;        // length of data (including terminator)
int nAllocLength;      // length of allocation
// TCHAR data[nAllocLength]
TCHAR* data()          // TCHAR* to managed data
  { return (TCHAR*)(this+1); }
};
实际使用时,该结构体的所占用的内存块大小是不固定的,在CString内部的内存块头部,放置的是该结构体。从该内存块头部开始的sizeof(CstringData)BYTE后才是真正的用于存放字符串的内存空间。这种结构的数据结构的申请方法是这样实现的:
pData = (CStringData*) new BYTE[sizeof(CStringData) + (nLen+1)*sizeof(TCHAR)];
pData->nAllocLength = nLen;
其中nLen是用于说明需要一次性申请的内存空间的大小的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。