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<
void MakeUpper( );
将小写字母转换为大写字母
例:
csStr=“abcdef中文123456”;
csStr.MakeUpper();
cout<
void MakeLower( );
将大写字母转换为小写字母
例:
csStr=“ABCDEF中文123456”;
csStr.MakeLower();
cout<
int Compare( LPCTSTR lpsz ) const;
区分大小写比较两个字符串,相等时返回0,大于时返回1,小于时返回-1
例:
csStr=“abcdef中文123456”;
csStr2=“ABCDEF中文123456”;
cout<
int CompareNoCase( LPCTSTR lpsz ) const;
不区分大小写比较两个字符串,相等时返回0,大于时返回1,小于时返回-1
例:
csStr=“abcdef中文123456”;
csStr2=“ABCDEF中文123456”;
cout<
int Delete( int nIndex, int nCount = 1 )
删除字符,删除从下标nIndex开始的nCount个字符
例:
csStr=“ABCDEF”;
csStr.Delete(2,3);
cout<
//当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=“abc”;
csStr.Insert(2,“xyz”);
cout<
//当nIndex为负数时,插入在对象开头
//当nIndex超出对象末尾时,插入在对象末尾
int Remove( TCHAR ch );
移除对象内的指定字符。返回移除的数目
例:
csStr=“aabbaacc”;
csStr.Remove(‘a’);
cout<
int Replace( TCHAR chOld, TCHAR chNew );
int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );
替换字串
例:
csStr=“abcdef”;
csStr.Replace(‘a’,‘x’);
cout<
csStr="abcdef";
csStr.Replace("abc","xyz");
cout<
void TrimLeft( );
void TrimLeft( TCHAR chTarget );
void TrimLeft( LPCTSTR lpszTargets );
从左删除字符,被删的字符与chTarget或lpszTargets匹配,一直删到第一个不匹配的字符为止
例:
csStr=“aaabaacdef”;
csStr.TrimLeft(‘a’);
cout<
csStr=“aaabaacdef”;
csStr.TrimLeft(“ab”);
cout<
//无参数时删除空格
void TrimRight( );
void TrimRight( TCHAR chTarget );
void TrimRight( LPCTSTR lpszTargets );
从右删除字符,被删的字符与chTarget或lpszTargets匹配,一直删到第一个不匹配的字符为止
例:
csStr=“abcdeaafaaa”;
csStr.TrimRight(‘a’);
cout<
csStr="abcdeaafaaa";
csStr.TrimRight("fa");
cout<
void Empty( );
清空
例:
csStr=“abcdef”;
csStr.Empty();
printf("%d",csStr.GetLength());
//0
BOOL IsEmpty( ) const;
测试对象是否为空,为空时返回true,不为空时返回false
例:
csStr=“abc”;
cout<
csStr.Empty();
cout<
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<
cout<
cout<
int FindOneOf( LPCTSTR lpszCharSet ) const;
查找lpszCharSet中任意一个字符在CString对象中的匹配位置。未找到时返回-1,否则返回字串的开始位置
例:
csStr=“abcdef”;
cout<
CString SpanExcluding( LPCTSTR lpszCharSet ) const;
返回对象中与lpszCharSet中任意匹配的第一个字符之前的子串
例:
csStr=“abcdef”;
cout<
CString SpanIncluding( LPCTSTR lpszCharSet ) const;
从对象中查找与lpszCharSe中任意字符不匹配的字符,并返回第一个不匹配字符之前的字串
例:
csStr=“abcdef”;
cout<
int ReverseFind( TCHAR ch ) const;
从后向前查找第一个匹配,找到时返回下标。没找到时返回-1
例:
csStr=“abba”;
cout<
void Format( LPCTSTR lpszFormat, … );
void Format( UINT nFormatID, … );
格式化对象,与C语言的sprintf函数用法相同
例:
csStr.Format("%d",13);
cout<
TCHAR GetAt( int nIndex ) const;
返回下标为nIndex的字符,与字符串的[]用法相同
例:
csStr=“abcdef”;
cout<
//当nIndex为负数或超出对象末尾时,会发生无法预料的结果。
void SetAt( int nIndex, TCHAR ch );
给下标为nIndex的字符重新赋值
例:
csStr=“abcdef”;
csStr.SetAt(2,‘x’);
cout<
//当nIndex为负数或超出对象末尾时,会发生无法预料的结果。
CString Left( int nCount ) const;
从左取字串
例:
csStr=“abcdef”;
cout<
//当nCount等于0时,返回空。
//当nCount为负数时,返回空。
//当nCount大于对象长度时,返回值与对象相同。
CString Right( int nCount ) const;
从右取字串
例:
csStr=“abcdef”;
cout<
//当nCount等于0时,返回空。
//当nCount为负数时,返回空。
//当nCount大于对象长度时,返回值与对象相同。
CString Mid( int nFirst ) const;
CString Mid( int nFirst, int nCount ) const;
从中间开始取字串
例:
csStr=“abcdef”;
cout<
csStr=“abcdef”;
cout<
//当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<
//使用完GetBuffer后,必须使用ReleaseBuffer以更新对象内部数据,否则会发生无法预料的结果。
void ReleaseBuffer( int nNewLength = -1 );
使用GetBuffer后,必须使用ReleaseBuffer以更新对象内部数据
例:
csStr=“abc”;
LPTSTR pStr=csStr.GetBuffer(10);
strcpy(pStr,“12345”);
cout<
csStr.ReleaseBuffer();
cout<
LPTSTR GetBufferSetLength( int nNewLength );
申请新的空间,并返回指针
例:
csStr=“abc”;
csStr.GetBufferSetLength(20);
cout<
count<
csStr.ReleaseBuffer();
count<
//使用GetBufferSetLength后可以不必使用ReleaseBuffer
转自:https://blog.csdn.net/a345719863/article/details/53433007
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 的话,那么直接用 CString 即可:
char sz[] = “123456”;
CString str( sz );
CString 的构造函数在内部会把它转换为 UNICODE 宽字符。
如果你的工程不是 UNICODE 的话,它就不转换了。
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);
前段时间,做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字符。该方法也正确。