(一) 概述 string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳入C++标准之中; CString(typedef CStringT > CString)为Visual C++中最常用的字符串类,继承自CSimpleStringT类,主要应用在MFC和ATL编程中,主要数据类型有char(应用于ANSI),wchar_t(unicode),TCHAR(ANSI与unicode均可); char*为C编程中最常用的字符串指针,一般以'\0'为结束标志; (二) 构造 string是方便的,可以从几乎所有的字符串构造而来,包括CString和char*; CString次之,可以从基本的一些字符串变量构造而来,包括char*等; char*没有构造函数,仅可以赋值; 举例: char* psz = “joise”; CString cstr( psz ); string str( cstr ); (三) 运算符重载 a) operator= string是最方便的,几乎可以直接用所有的字符串赋值,包括CString和char*; 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; b) operator+ string与CString差不多,可以直接与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不行 c) operator += string是最强大的,几乎可以与所有的字符串变量+=,包括CString和char*; CString次之,可以与基本的一些字符串变量进行+=而来,包括char*等; char*没有+=运算符,只能使用strcat把两个指针连在一起; d) operator[] CString最好,当越界时会抛出断言异常; string与char*下标越界结果未定义; 举例: char* psz = “joise”; CString cstr = psz; cout << cstr[8]; string str = psz; cout << str[8]; cout << psz[8]; e) operator== 、operator!=、operator> 、operator< 、operator>= 、perator<= CString与string之间不可以进行比较,但均可以与char*进行比较,并且比较的是值,而不是地址; cout << ( psz == cstr ); cout << ( psz == str ); cout << ( str == psz ); cout << ( cstr == psz );//以上代码返回均为1 (四) 常用算法 a) 查找
作用 | char* | string | CString | 查找指定值 | strchr strstr strrstr strspn | find | Find | 第一个匹配的值 | | fild_first_of | FindOneOf | 从后面开始查找 | | | ReserveFind | 指定匹配方式 | | find_if | | 注:find_if中是把范围内的值挨个代入匹配函数直至返回true b) 比较
作用 | char* | string | CString | 查找指定值(区分大小写) | strcmp strncmp strcoll _strncoll | operator< operator> operator<= operator>= operator== operator!= | Collate Compare | 查找指定值(不区分大小写) | _stricmp _strnicmp _stricoll _strnicoll | | CollateNoCase CompareNoCas | 注:返回值如果<0则前面的值小于后面的值,反之亦然 c) 替换
作用 | char* | string | CString | 查找指定值 | _strset _strnset | replace replace_copy replace_copy_if replace_if | Replace | d) 插入
作用 | char* | string | CString | 查找指定值 | | insert | Insert | e) 增加
作用 | char* | string | CString | 动态增加值 | strcat | push append | Append AppendChar AppendFormat | f) 截取
作用 | char* | string | CString | 得到部分值 | 用下标操作 | substr | Left Mid Right Truncate | g) 移除
作用 | char* | string | CString | 移除部份值 | | remove | Remove | 移除空白值 | RemoveBlanks 注:此为ATL提供,非C函数 | remove_if | Trim TrimLeft TrimRig | h) 转换大小写
作用 | char* | string | CString | 转换大小写 | _strlwr _strupr | | MakeLower MakeUpper | i) 与其他类型转换
作用 | char* | string | CString | 转化为数字 | atoi atod atof | | Format | 转化为char* | | c_str | GetBuffer GetBufferSetLen | j) 格式化
作用 | char* | string | CString | 格式化 | sprintf | | Format | k) 得到长度
作用 | char* | string | CString | 得到长度 | strlen | length | GetLength | 得到大小 | | size | GetAllocLength | l) 判断为空
作用 | char* | string | CString | 判断是否为空 | 判断是否==NULL或者第一个字符是否是'\0' | empty | IsEmpty | m) 重定义大小
作用 | char* | string | CString | 重定义大小 | realloc new | resize | GetBufferSetLength | n) 释放资源
作用 | char* | string | CString | 释放 | free delete (delete[]) | | ReleaseBuffer ReleaseBufferSetLength | (五) 安全性> CString > string > char*; (六) 灵活性 CString > string >char*; (七) 可移植性 char* = string > CString |
String,CString,TCHAR,char之间区别和联系
2008-07-25 19:53
char是类型 TCHAR也是!不过他可以通过是否定义了UNICODE宏来判断到底是 char还是w_char; | TCHAR是一种字符串类型,它让你在以MBCS和UNNICODE来build程序时可以使用同样的代码,不需要使用繁琐的宏定义来包含你的代码,而char代表ASCII的字符 #ifdef UNICODE typedef wchar_t TCHAR; #else typedef char TCHAR; #endif 所以用MBCS来build时,TCHAR是char,使用UNICODE时,TCHAR是wchar_t. 至于String,CString他们都是一种封装了字串处理的操作! 你可以打开他们的源代码找寻究竟! CString属于VC的类库 string是标准C++的类库 string.h是C的库函数。 研究它们的源代好些! TCHAR,char是可以同整型互换的类型。 String,CString代表了一块内存区域。 TCHAR 赋值 #include <tchar.h> TCHAR szWindowText[256]=_T("QQ2006"); char*、TCHAR*转换CString CString str(****) 下面详细写一下其它转换 // TCHAR* CPublic::CString2TCHAR(CString &str) { int iLen = str.GetLength(); TCHAR* szRs = new TCHAR[iLen]; lstrcpy(szRs, str.GetBuffer(iLen)); str.ReleaseBuffer(); return szRs; } char* CPublic::THCAR2char(TCHAR* tchStr) { int iLen = 2*wcslen(tchStr);//CString,TCHAR汉字算一个字符,因此不用普通计算长度 char* chRtn = new char[iLen+1] wcstombs(chRtn,tchStr,iLen+1);//转换成功返回为非负值 return chRtn; } char* CPublic::CString2char(CString &str) { int len = str.GetLength(); char* chRtn = (char*)malloc((len*2+1)*sizeof(char));//CString的长度中汉字算一个长度 memset(chRtn, 0, 2*len+1); USES_CONVERSION; strcpy((LPSTR)chRtn,OLE2A(str.LockBuffer())); return chRtn; } //参考 /// //Pocket PC上的UNICODE和ANSI字符串 //By Vassili Philippov, September 26, 2001. //杨方思歧 译 char* GetAnsiString(const CString &s) { int nSize = 2*s.GetLength(); char *pAnsiString = new char[nSize+1]; wcstombs(pAnsiString, s, nSize+1); return pAnsiString; } // |
项目中经常用到各种不同的语言的朋友们应该会比较有这样的体会:一种开发语言用了比较长的时间,突然间转到另外一种语言的话,不管是数据类型或者语法结构,多多少少都会有那么一点不适应。哪怕MFC中的类型与标准
C++
也是一样的。下面是MFC/
C++
/C中字符类型CString, int, string, char*之间的转换的说明与举例,经常用的东西,相信对于用C/C++的朋友,还是比较有用的。
1 CString,int,string,char*之间的转换
string转CString
CString.format("%s", string.c_str());
char转CString
CString.format("%s", char*);
char转string
string s(char *);
string转char *
char *p = string.c_str();
// CString转std::string
CString str = dlg.GetPathName(); setlocale(LC_ALL, "chs");
char *p = new char[256];
wcstombs( p, str, 256 );
m_fileName = p;
1,string -> CString CString.format("%s", string.c_str());用c_str()确实比data()要好. 2,char -> string
string s(char *);
你的只能初始化,在不是初始化的地方最好还是用assign(). 3,CString -> string string s(CString.GetBuffer()); GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
《C++标准函数库》中说的
有三个函数可以将字符串的内容转换为字符数组和C—string
1.data(),返回没有“\0”的字符串数组2,c_str(),返回有“\0”的字符串数组3,copy()
CString互转int
将字符转换为整数,可以使用atoi、_atoi64或atol。
而将数字转换为CString变量,可以使用CString的Format函数。如
CString s;
int i = 64;
s.Format("%d", i) Format函数的功能很强,值得你研究一下。
void CStrDlg::OnButton1()
{
// TODO: Add your control notification handler code here
CString
ss="1212.12";
int temp=atoi(ss);
CString aa;
aa.Format("%d",temp);
AfxMessageBox("var is " + aa);
}
sart.Format("%s",buf);
CString互转char*
///char * TO cstring
CString strtest;
char * charpoint;
charpoint="give string a value";
strtest=charpoint;
///cstring TO char *
charpoint=strtest.GetBuffer(strtest.GetLength());
标准C里没有string,char *==char []==string
可以用CString.Format("%s",char *)这个方法来将char *转成CString。要把CString转成char *,用操作符(LPCSTR)CString就可以了。
CString转换char[100]
char a[100];
CString str("aaaaaa");
strncpy(a,(LPCTSTR)str,sizeof(a));
2 CString类型的转换成int
CString类型的转换成int
将字符转换为整数,可以使用atoi、_atoi64或atol。
//CString aaa = "16" ;
//int int_chage = atoi((lpcstr)aaa) ;
而将数字转换为CString变量,可以使用CString的Format函数。如
CString s;
int i = 64;
s.Format("%d", i) Format函数的功能很强,值得你研究一下。
如果是使用char数组,也可以使用sprintf函数。
//CString ss="1212.12";
//int temp=atoi(ss);
//CString aa;
//aa.Format("%d",temp);
数字->字符串除了用CString::Format,还有FormatV、sprintf和不需要借助于Afx的itoa
3 char*在装int
#include <stdlib.h>
int atoi(const char *nptr);
long atol(const char *nptr);
long long atoll(const char *nptr);
long long atoq(const char *nptr);
4 CString,int,string,char*之间的转换
string aa("aaa");
char *c=aa.c_str();
cannot convert from 'const char *' to 'char *'
const char *c=aa.c_str();
5 CString,int,string,char*之间的转换string.c_str()只能转换成const char *,
要转成char *这样写:
string mngName;
char t[200]; memset(t,0,200); strcpy(t,mngName.c_str());
原文地址:http://blog.sina.com.cn/s/blog_9017526301010r1i.html