CString 的成员函数详解

CString 的成员函数详解

CSTRING的成员函数详解

typedef ATL::CStringT< TCHAR, StrTraitMFC_DLL< TCHAR > > CString;
CString的构造函数:
1 CString( );
2 CString( const CString& stringSrc );
3 CString( TCHAR ch, int nRepeat = 1 );
4 CString( LPCTSTR lpch, int nLength );
5 CString( const unsigned char* psz );
6 CString( LPCWSTR lpsz );
7 CString( LPCSTR lpsz );
CString 成员函数详解:

1.CString 的构造函数:
// 缺省构造函数
CString()
例:
CString csStr;

   // 复制构造函数
  CString(const CString& stringSrc)    
   例:
   CString    csStr("ABCDEF  中文 123456");
   CString    csStr2(csStr);

   // 用字符初始化
  CString(TCHAR ch, int nRepeat = 1)
  例:
  CString    csStr('a', 5);            // csStr = "aaaaa"

   // 用字符串前几个字符初始化
  CString(LPCTSTR lpch, int nLength) 
  例:
  CString    csStr("abcdef", 3);  // csStr = "abc"

   // 用宽字符串初始化
   CString(LPCWSTR lpsz)     
   例:
   wchar_t     s[] = L"abcdef";
   CString      csStr(s);               // csStr = L"abcdef"


   // 用字符串初始化 
   CString(LPCSTR lpsz)          
   例:
   CString     csStr("abcdef");     // csStr = "abcdef"

  // 用字符串初始化
   CString(const unsigned char * psz) 
   例:
   const unsigned char s[] = "abcdef";
   const unsigned char *sp = s;
   CString csStr(sp); // csStr = "abcdef"  

2.CString 的成员函数:

int GetLength( ) const;
返回字符串的长度,不包含结尾的空字符。
例:
csSt r= “ABCDEF中文123456”;
printf("%d",csStr.GetLength());
// 16

void MakeReverse( );
颠倒字符串的顺序
例:
csStr=“ABCDEF中文123456”;
csStr.MakeReverse();
cout<<csStr;
// 654321文中FEDCBA

void MakeUpper( );
将小写字母转换为大写字母
例:
csStr=“abcdef中文123456”;
csStr.MakeUpper();
cout<<csStr;
// ABCDEF中文123456

void MakeLower( );
将大写字母转换为小写字母
例:
csStr=“ABCDEF中文123456”;
csStr.MakeLower();
cout<<csStr;
// abcdef中文123456

int Compare( LPCTSTR lpsz ) const;
区分大小写比较两个字符串,相等时返回0,大于时返回1,小于时返回-1
例:
csStr=“abcdef中文123456”;
csStr2=“ABCDEF中文123456”;
cout<<csStr.CompareNoCase(csStr2);
// -1

int CompareNoCase( LPCTSTR lpsz ) const;
不区分大小写比较两个字符串,相等时返回0,大于时返回1,小于时返回-1
例:
csStr=“abcdef中文123456”;
csStr2=“ABCDEF中文123456”;
cout<<csStr.CompareNoCase(csStr2);
//0

int Delete( int nIndex, int nCount = 1 )
删除字符,删除从下标nIndex开始的nCount个字符
例:
csStr=“ABCDEF”;
csStr.Delete(2,3);
cout<<csStr;
// ABF
//当nIndex过大,超出对像所在内存区域时,函数没有任何操作。
//当nIndex为负数时,从第一个字符开始删除。
//当nCount过大,导致删除字符超出对像所在内存区域时,会发生无法预料的结果。
//当nCount为负数时,函数没有任何操作。

int Insert( int nIndex, TCHAR ch )
int Insert( int nIndex, LPCTSTR pstr )在下标为nIndex的位置,插入字符或字符串。返回插入后对象的长度
例:
csStr=“abc”;
csStr.Insert(2,‘x’);
cout<<csStr;
//abxc
csStr=“abc”;
csStr.Insert(2,“xyz”);
cout<<csStr;
//abxyzc

  //当nIndex为负数时,插入在对象开头
  //当nIndex超出对象末尾时,插入在对象末尾

int Remove( TCHAR ch );
移除对象内的指定字符。返回移除的数目
例:
csStr=“aabbaacc”;
csStr.Remove(‘a’);
cout<<csStr;
//bbcc

int Replace( TCHAR chOld, TCHAR chNew );
int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );
替换字串
例:
csStr=“abcdef”;
csStr.Replace(‘a’,‘x’);
cout<<csStr;
//xbcdef

  csStr="abcdef";
  csStr.Replace("abc","xyz");
  cout<<csStr;                   
  //xyzdef

void TrimLeft( );
void TrimLeft( TCHAR chTarget );
void TrimLeft( LPCTSTR lpszTargets );
从左删除字符,被删的字符与chTarget或lpszTargets匹配,一直删到第一个不匹配的字符为止
例:
csStr=“aaabaacdef”;
csStr.TrimLeft(‘a’);
cout<<csStr;
//baacdef
csStr=“aaabaacdef”;
csStr.TrimLeft(“ab”);
cout<<csStr;
//cdef

  //无参数时删除空格

void TrimRight( );
void TrimRight( TCHAR chTarget );
void TrimRight( LPCTSTR lpszTargets );
从右删除字符,被删的字符与chTarget或lpszTargets匹配,一直删到第一个不匹配的字符为止
例:
csStr=“abcdeaafaaa”;
csStr.TrimRight(‘a’);
cout<<csStr;
//abcdeaaf

  csStr="abcdeaafaaa";
  csStr.TrimRight("fa");
  cout<<csStr;               
  //abcde
 //无参数时删除空格

void Empty( );
清空
例:
csStr=“abcdef”;
csStr.Empty();
printf("%d",csStr.GetLength());
//0

BOOL IsEmpty( ) const;
测试对象是否为空,为空时返回true,不为空时返回false
例:
csStr=“abc”;
cout<<csStr.IsEmpty();
//1;
csStr.Empty();
cout<<csStr.IsEmpty();
//0;

int Find( TCHAR ch ) const;
int Find( LPCTSTR lpszSub ) const;
int Find( TCHAR ch, int nStart ) const;
int Find( LPCTSTR pstr, int nStart ) const;
查找字串,nStart为开始查找的位置。未找到匹配时返回-1,否则返回字串的开始位置
例:
csStr=“abcdef”;
cout<<csStr.Find(‘b’);
//1
cout<<csStr.Find(“de”);
//3

  cout<<csStr.Find('b',3);    
 //-1

  cout<<csStr.Find('b',0);    
  //1

  cout<<csStr.Find("de",4);   
  //-1

  cout<<csStr.Find("de",0);   
  //3

  //当nStart超出对象末尾时,返回-1。
  //当nStart为负数时,返回-1。

int FindOneOf( LPCTSTR lpszCharSet ) const;
查找lpszCharSet中任意一个字符在CString对象中的匹配位置。未找到时返回-1,否则返回字串的开始位置
例:
csStr=“abcdef”;
cout<<csStr.FindOneOf(“cxy”);
//2

CString SpanExcluding( LPCTSTR lpszCharSet ) const;
返回对象中与lpszCharSet中任意匹配的第一个字符之前的子串
例:
csStr=“abcdef”;
cout<<csStr.SpanExcluding(“cf”);
//ab

CString SpanIncluding( LPCTSTR lpszCharSet ) const;
从对象中查找与lpszCharSe中任意字符不匹配的字符,并返回第一个不匹配字符之前的字串

例:
csStr=“abcdef”;
cout<<csStr.SpanIncluding(“fdcba”);
//abcd

int ReverseFind( TCHAR ch ) const;
从后向前查找第一个匹配,找到时返回下标。没找到时返回-1
例:
csStr=“abba”;
cout<<csStr.ReverseFind(‘a’);
//3

void Format( LPCTSTR lpszFormat, … );
void Format( UINT nFormatID, … );
格式化对象,与C语言的sprintf函数用法相同
例:
csStr.Format("%d",13);
cout<<csStr;
//13

TCHAR GetAt( int nIndex ) const;
返回下标为nIndex的字符,与字符串的[]用法相同
例:
csStr=“abcdef”;
cout<<csStr.GetAt(2);
//c
//当nIndex为负数或超出对象末尾时,会发生无法预料的结果。

void SetAt( int nIndex, TCHAR ch );
给下标为nIndex的字符重新赋值
例:
csStr=“abcdef”;
csStr.SetAt(2,‘x’);
cout<<csStr;
//abxdef
//当nIndex为负数或超出对象末尾时,会发生无法预料的结果。

CString Left( int nCount ) const;
从左取字串
例:
csStr=“abcdef”;
cout<<csStr.Left(3);
//abc
//当nCount等于0时,返回空。
//当nCount为负数时,返回空。
//当nCount大于对象长度时,返回值与对象相同。

CString Right( int nCount ) const;
从右取字串
例:
csStr=“abcdef”;
cout<<csStr.Right(3);
//def
//当nCount等于0时,返回空。
//当nCount为负数时,返回空。
//当nCount大于对象长度时,返回值与对象相同。

CString Mid( int nFirst ) const;
CString Mid( int nFirst, int nCount ) const;
从中间开始取字串
例:
csStr=“abcdef”;
cout<<csStr.Mid(2);
//cdef
csStr=“abcdef”;
cout<<csStr.Mid(2,3);
//cde
//当nFirst为0和为负数时,从第一个字符开始取。
//当nFirst等于对象末尾时,返回空字串。
//当nFirst超出对象末尾时,会发生无法预料的结果。
//当nCount超出对象末尾时,返回从nFirst开始一直到对象末尾的字串
//当nCount为0和为负数时,返回空字串。

LPTSTR GetBuffer( int nMinBufLength );
申请新的空间,并返回指针
例:
csStr=“abcde”;
LPTSTR pStr=csStr.GetBuffer(10);
strcpy(pStr,“12345”);
csStr.ReleaseBuffer();
pStr=NULL;
cout<<csStr
//12345
//使用完GetBuffer后,必须使用ReleaseBuffer以更新对象内部数据,否则会发生无法预料的结果。

void ReleaseBuffer( int nNewLength = -1 );
使用GetBuffer后,必须使用ReleaseBuffer以更新对象内部数据
例:
csStr=“abc”;
LPTSTR pStr=csStr.GetBuffer(10);
strcpy(pStr,“12345”);
cout<<csStr.GetLength();
//3(错误的用法)

  csStr.ReleaseBuffer();
  cout<<csStr.GetLength();      
  //5(正确)
  pStr=NULL;
  //CString 对象的任何方法都应在ReleaseBuffer之后调用

LPTSTR GetBufferSetLength( int nNewLength );
申请新的空间,并返回指针
例:
csStr=“abc”;
csStr.GetBufferSetLength(20);
cout<<csStr;
//abc
count<<csStr.GetLength();
//20;
csStr.ReleaseBuffer();
count<<csStr.GetLength();
//3;
//使用GetBufferSetLength后可以不必使用ReleaseBuffer

转自:https://blog.csdn.net/a345719863/article/details/53433007

Cstring 在不同编码下与char的关系

Cstring是一个封装好了的类,封装时必须考虑兼容问题,所以Cstring 等价于LPCTSTR ,这里C表示常量不是很重要,重要的是T这是个宏,如果定义了统一码(unicode),宏T也表示宽字符(W表示宽字符),即一个字符占2字节。这种情况下 T(“xxx”)等价于L"xxx"的;这样一来 如果没定义unicode CString = LPCTSTR =const char*;如果定义了unicode CString=LPCTSTR=LPCWSTR = const w_char*(都是宽字符);如果指针之间等价是可以强制转换的(这里是说指针,不包括Cstring 这是个类),
但是指针转Cstring 可以借助Cstring的 构造函数 ,C string有6个 构造函数 其中就有char转Cstring的,CString( LPCSTR lpsz ); 所以mancode=CString(sRead);。

UNICODE下 char* 转换到CString 的问题

如果你的工程是 UNICODE 的话,那么直接用 CString 即可:

char sz[] = “123456”;

CString str( sz );

CString 的构造函数在内部会把它转换为 UNICODE 宽字符。

如果你的工程不是 UNICODE 的话,它就不转换了。

mfc CString 转 char *

https://www.cnblogs.com/banluxinshou/p/9081504.html
做界面时遇到需要从界面编辑框接受输入字符(用户名,密码之类),然后转为char *类型交给程序处理,记录一下找到的方法,主要参考https://blog.csdn.net/neverup_/article/details/5664733
编码方式
关于编码方式的说明如下,看了之后就理解了为什么需要转换。

开发是在vs2015下做的,默认字符集编码是Unicode,但在VC6.0等工程中,默认的字符集形式是多字节字符集(MBCS:Multi-Byte Character Set),这样导致在VC6.0中非常简单实用的各类字符操作和函数在VS2005环境下运行时会报各种各样的错误,这里总结了在VS环境中Unicode字符集下CString和char *之间相互转换的几种方法,其实也就是Unicode字符集与MBCS字符集转换。

首先说明一下它们所占的内存大小。CString属于所谓的宽字符集,占一个字符占两个字节;char类型属于窄字符集,一个char字符占一个字节,所以它们之间的转换涉及到字节大小的转换。另一方面MFC中Ctring,默认采用unicode编码,而char采用ansi编码,两种编码中单个字符占的存储大小也是不同的。

1、Unicode下 CString转换为char *
  方法1:使用函数 T2A、W2A

CString cstr = _T("test")
//声明标识
USES_CONVERSION;
//函数T2A和W2A均支持ATL和MFC中的字符
char * pFileName = T2A(cstr);   
//char * pFileName = W2A(cstr); //也可实现转换

注意:有时候可能还需要添加引用#include <afxpriv.h>

这个方法已经验证过,在VS2015 unicode编码环境下转换成功
方法2:使用API:WideCharToMultiByte进行转换

CString str = _T("test");

//注意:以下n和len的值大小不同,n是按字符计算的,len是按字节计算的
int n = str.GetLength();

//获取宽字节字符的大小,大小是按字节计算的
 int len = WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);

//为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小
char * pFileName = new char[len+1];   //以字节为单位

//宽字节编码转换成多字节编码
WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),pFileName,len,NULL,NULL);
pFileName[len+1] = '/0';   //多字节字符以'/0'结束

这个方法没有验证过。
2、Unicode下char *转换为CString
  方法1:使用API:MultiByteToWideChar进行转换

char * pFileName = "test";

//计算char *数组大小,以字节为单位,一个汉字占两个字节
int charLen = strlen(pFileName);

//计算多字节字符的大小,按字符计算。
int len = MultiByteToWideChar(CP_ACP,0,pFileName,charLen,NULL,0);

//为宽字节字符数组申请空间,数组大小为按字节计算的多字节字符大小
TCHAR *buf = new TCHAR[len + 1];

//多字节编码转换成宽字节编码
MultiByteToWideChar(CP_ACP,0,pFileName,charLen,buf,len);

buf[len] = '/0'; //添加字符串结尾,注意不是len+1

//将TCHAR数组转换为CString
CString pWideChar;
pWideChar.Append(buf);

//删除缓冲区
delete []buf;

方法二:使用函数 A2T、A2W
 1 char * pFileName = “test”;
2
3 USES_CONVERSION;
4 CString s = A2T(pFileName);
5 //CString s = A2W(pFileName);

CString::GetLength()获得字节数的正确方法

前段时间,做http协议上传文件及断点续传控件时,在客户端采用C++调用CHttpConnection、CHttpFile进行文件上传。移植到Unicode编码时,上传得到的文件总是小于正常文件。最终发现问题出在CString::GetLength()方法上。当采用Unicode编码时,而且http header字符串中出现了中文或其其他多字节字符,该方法仍旧只返回字符数,而不是实际的字节数,这样在http header中的信息会比实际的少,导致http发送的数据小于预期的。

  按照MSDN的说吗,在选用MBCS多字节字符串编码时,该方法会得到正确的字节数。此时没有问题。

  For multibyte character sets (MBCS), GetLength counts each 8-bit character; that is, a lead and trail byte in one multibyte character are counted as two bytes.

  但是在Unicode编码下,一旦出现中文字符,该方法就会少统计。

  我试用最多的解决方法是:

  CString str("abc我");

  DWORD le0 = str.GetLength(); // 返回4,不是想要的字节数

  // 这样处理就对了。先用CStringA类转化成多字节字符串。

  le0 = CStringA(str).GetLength();

另外,也有人这样用,也可以。比上面效率高。

   DWORD le0 = str.GetLength() * sizeof(TCHAR);

// 这种用法在MBCS环境下可以省略。在Unicode下,所有字符(包括ascii及中文字符), 每个字符都被定义为WHAR, 即双字节Unicode字符。该方法也正确。

おすすめ

転載: blog.csdn.net/wowocpp/article/details/121614423