串,即是由符组成的串
,在标准C
,标准C++
,MFC
中串
这一功能的实现
是不相同
的,C++
完全兼容了C
.
1
.标准C中的串
在标准C
中没有串
数据类型,C中的串
是有符
类型的符数组
或符
类型的符指针
来实现的.如:
char name[26]="This is a Cstyle string";
//或char *name="This is a Cstyle string";
类型的串
以\0
为结束标记
,所占内存
是实际子符长度+1
,要逐个字符的赋值
初化与赋值,不知道是否修改
,粒度太小
,很不直观
.
char*
没有构造器
,仅能由指针赋值
,而且是个极其危险的操作
,在声明char*
时如果没有赋初值
,建议,先按无效
初化,以免出现悬浮指针
或地址不明的指针
,否则,出错
会让你很悲惨!
标准C
中是没有串
类型,但是在C
中有string.h
头文件,注意,如下string.h
中的串
非彼串
,<string.h>
头文件中定义
了一些经常用到的操作串的函数
,如复制strcpy
函数,连接串strcat
,比较串strcmp
,这些函数的操作对象
都是指向char*
的串.
2
.标准C++
中的串
类
C++
支持C风格串
的使用,而且引入了串
类的概念,串
为标准模板类STL
定义的串
,几乎可从所有的串
中构造出来
.
串
串类的头文件
是<string>
,且要和usingnamespacestd;
一起使用.<string>
头文件和<string.h>
头文件没有关系,前者
是标准C++
中的模板库类
,后者是标准C
中的包含常用C串处理函数
的头文件
,如strcmp
,前者并非是后者的升级版
.
要深刻
理解标准C++
中串
是一个类
,如在标准C
中定义如下:char*pt=NULL;
这无疑是正确的
,但是在标准C++
中定义string*pt=NULL
;
这样做编译器
不会有警告和错误
,但是运行时
就会有异常
.这是因为串
是一个类
,定义类的对象
时要调用其构造器
,上例既没有调用其构造器
,还把指针
赋值为无效
,很明显会出错
.
正确的方法
是用新
符号,C++
中的新
不同于C中的malloc
,new
不但会分配一块内存
,还调用类的构造器
.string*pt=new("thisisac++stylestring");
或不用指针
的string str;
,系统自动调用默认的构造器
,构造一个串
类的对象
.
3.MFC
中的CString
类.
MFC
中的串类
是CString
,封装了串
的东西,并增加了一些接口
,在功能
上完全兼容串
类,而一些标准的C/C++
不能直接对CString
类操作,CString
类是微软
的VC++
提供的MFC
里面的一个类,所以只有支持MFC
的工程才可用.
如在linux
上的工程就不能用CString
了,只能用标准C++
中的串
类了.另外,因为串
类是在c++
标准库中,所以在std
名字空间中封装它
,用前要声明using namespace std
;
而CString
类,并不在std
名字空间中,因为它不是c++
的标准库,只是微软的一个封装库
.这点
看来用串
类的程序的移植性更好
.
CString
和串
提供的接口方法
不同,对char*
的转换也不同.
4.1CString
和串
的转换
string str="ksarea";
CString cstr(str.c_str());//或`CString cstr(str.data());`初化时才行
cstr=str.c_str();或cstr=str.data();
str=cstr.GetBuffer(0);//`CString->string`
cstr.format("%s", str.c_str());//`string->CString`
cstr.format("%s", str.data());//`string->CString`
str = LPCSTR(cstr);//`CString->string`/*`c_str()`和`data()`区别是:前者返回带`'/0'`的串,后者则返回不带`'/0'`的串*/
4.2.CString
和整
的转换int i=123;
CString str;
str.format("%d",i);
//`int->CString`其他的基本类型转换类似
i=atoi(str);
//`CString->int`还有`(atof,atol)4.3.char*`和`CString`的转换`CStringcstr="ksarea";`
char* ptemp=cstr.getbuffer(0);
char* str;
strcpy(str,ptemp);//`CString->char*`
cstr.releasebuffer(-1);
char*str="lovesha";
CString cstr=str;
char*->CString
,串
类型不能直接赋值
给CString
至于整
与float,string
与char*
间的转换可用强制转换
,或标准库函数
.
CString
与其他类型
的转换
,方法有很多,但其实都殊途同归
,首先转换
类型为char*
类型,因为char*
是不同类型
间的桥梁.得到char*
类型,再按其他类型
转换就非常容易了
.