( 一 ) 概述
string 和 CString 均是字符串模板类, string 为标准模板类( STL )定义的字符串类,已经纳入 C++ 标准之中;
CString ( typedef CStringT<TCHAR, StrTraitMFC<TCHAR>> 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 CompareNoCase |
注:返回值如果 <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 TrimRigth |
h) 转换大小写
作用 |
char* |
string |
CString |
转换大小写 |
_strlwr _strupr |
|
MakeLower MakeUpper |
i) 与其他类型转换
作用 |
char* |
string |
CString |
转化为数字 |
atoi atod atof |
|
Format |
转化为 char* |
|
c_str |
GetBuffer GetBufferSetLength |
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
文章来自:优快云技术中心