Chinaunix首页 | 论坛 | 博客
  • 博客访问: 698513
  • 博文数量: 112
  • 博客积分: 2486
  • 博客等级: 大尉
  • 技术积分: 1541
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-14 18:30
文章分类

全部博文(112)

文章存档

2012年(5)

2011年(48)

2010年(26)

2009年(33)

我的朋友

分类: LINUX

2009-12-14 19:01:50

最近在做一个linux上的C语言的项目,要频繁的用到char *字符串操作,即用C语言提供的string.h中的标准字符串操作API对字符进行操作,工作量非常的,怀念以前用C++做项目的时候用STL的 string模版类。当然如果是在windows上开发支持MFC的工程,也可以用MFC类库中的cstring。在Linux上当然不会有微软的MFC 类库了咯,所以只能用标准C++的string类(也就是STL里面的string类)。

下面对CString类与string类做一个比较:

相同点:

(1)用他们都可以取代对char*的使用。

(2)都封装了有丰富的字符串操作接口。

(3)他们都是C++的类库。---也许你会说这不是明摆着的嘛,对,但是用的时候要记住。以string的使用为例,不能有如下用法:

     string * pstr = NULL;              //定义一个指向字符串的指针

     pstr->append("Hello world.");      //在该字符串的末尾粘接上另一个字符。

这样做编译器不会有任何警告和错误,但是运行的时候就会有异常。什么原因呢?

原因是没有理解string是一个类,而在定义类的对象的时候是需要调用其构造函数的。上面既没有调用string的构造函数,而且还把指针赋值为NULL,很明显调用该类的对象的接口的时候会出错。但是编译器却发现不了这个问题的。

正确的方法是如下:

/*这里必须要用c++的宏new,而不能用c中的malloc,原因是new不但会分配一块内存,*/
 /*还执行了类的构造函数。当然,string类的实例化还可以通过已有的某个string对象进行,请另查阅*/

 string * pstr = new string("Hello world.");
 pstr->append("Hello world.");
 cout<<"string * pstr is:"<<*pstr<

或者不用指针,如下也可以:

string str;     //会自动调用默认的构造函数,构造一个string类的对象。

str.apend("Hello world.");

cout<<"string str is:"<

(4)他们都使用了模板的技术。

不同之处:

(1)CString 类是微软的visual c++提供的MFC里面的一个类,所以只有支持MFC的工程才可以使用。如在linux上的工程就不能用CString了,只能用标准C++中的 string类了。另外,因为string类是在c++标准库中,所以它被封装在了std命名空间中,使用之前需要声明using namespace std;而CString类并不在std命名空间中,因为它不是c++的标准库,只是微软的一个封装库。这点看来用string类的程序的移植性更好。

(2)string类既是一个标准c++的类库,同时也是STL(Standard Template Library,标准模版库)中的类库,所以支持Iterator操作。

(3)CString类和string类提供的方法接口并不完全相同,所以不要糊里糊涂的认为某个类中怎么没有另外一个类中的方法啊。:-)。。

(4)他们和char*之间的转黄方法也不一样。string类型的变量如果要转换成char*类型字符串,string类中提供了三个方法如下:

const charT* c_str() const                     //c_str 直接返回一个以\0结尾的字符串。 
const charT* data() const //data 直接以数组方式返回string的内容,其大小为size()的返回值,结尾并没有\0字符
size_type copy(charT* buf, size_type n, size_type pos = 0) const //copy 把string的内容拷贝到buf空间中。
注意:c_str()的返回类型是指向常量charT类型的指针,说明指针所指空间的内容不允许修改,只可以读取不可以更改。c_str()返回的指针
     是string内部的指针,并没有像copy函数一样把其内容拷贝出来。这可以从下面例子中看出来:
 string * pstr = new string("Hello world.");

 const char * ptmp = pstr->c_str(); //并没有通过malloc或者new为指针ptmp分配内存,只是把string中的数据指针赋给了ptmp而已
cout<<"Get the string->cstr is:"<
但是如果用copy方法时必须如下方法:
 char * p = (char *)malloc(100*sizeof(char));    //必须为指针p分配内存空间用于存放从string里拷贝出来的数据
 pstr->copy(p,pstr->length(),0); //如果没有上面分配内存空间,这个语句在运行时就会报段错误。
 cout<<"char * p:copy from string is:"<

CString类型字符串对象转换成char*字符串比较麻烦一点,方法也有3种,详细的请查阅我的另一片博客:http://aphrodit.blog.sohu.com/76826778.html

 

 参考文献:

  • 阅读(3540) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~