Cstring和string的区别和联系 转“心灵驿站”

 
 

心灵驿站

 

2010-07-07 10:21:51|  分类: c++语言 |  标签: |字号 订阅

相同点:

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<<endl;

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

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

str.apend("Hello world.");

cout<<"string str is:"<<str<<endl;

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

不同之处:

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

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

3CString类和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:"<<ptmp<<endl; //正确的输出了Hello world.

但是如果用copy方法时必须如下方法:

 char * p = (char *)malloc(100*sizeof(char)); //必须为指针p分配内存空间用于存放从string里拷贝出来的数据

 pstr->copy(p,pstr->length(),0); //如果没有上面分配内存空间,这个语句在运行时就会报段错误。

 cout<<"char * p:copy from string is:"<<p<<endl; //正确的输出了字符串Hello world

CString类型字符串对象转换成char*字符串比较麻烦一点,方法也有3种:

今天遇到一个难题,以前一直都是从TCHAR *转换到CString,今天需要CString 转换成TCHAR *的方法,找了一下MSDN文档,没有发现有现成的函数可以用。后来上网搜索了一下,方法还不少。如下几种:

方法一,使用强制转换。例如:

CString theString( "This is a test" );

LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;

  方法二,使用strcpy。例如:

CString theString( "This is a test" );

LPTSTR lpsz = new TCHAR[theString.GetLength()+1];

_tcscpy(lpsz, theString);

  需要说明的是,strcpy(或可移值Unicode/MBCS_tcscpy)的第二个参数是 const wchar_t* (Unicode)const char* (ANSI),系统编译器将会自动对其进行转换。

方法三,使用CString::GetBuffer。例如:

CString s(_T("This is a test "));

LPTSTR p = s.GetBuffer();

// 在这里添加使用p的代码

if(p != NULL) *p = _T('\0');

s.ReleaseBuffer();

// 使用完后及时释放,以便能使用其它的CString成员函数

-------------------------------------------------------------------

我尝试了后面两种,都能成功,最后我还是选用了简单的第二种方法,因为采用第三种方法的话,需要用GetBuffer();函数,而该函数的使用需要非常的小心谨慎。

源码如下:

/**********

检查输入的手机型号是否合法。规定手机型号以CoolPad_开始。合法则返回TRUE,否则返回FALSE

***********/

BOOL CAutoBuildConfigDlg::CheckMobileName(CString strMobileName)

{

 wchar_t * pdest;

 CString strMobileName_temp;

 strMobileName_temp = strMobileName;

 TCHAR strCOOLPAD[] = L"COOLPAD_";

 LPTSTR lpsz =  new TCHAR[strMobileName_temp.GetLength()+1];

 wcsncpy_s(lpsz,(strMobileName_temp.GetLength()+1),strMobileName_temp, (strMobileName_temp.GetLength()+1));

 errno_t err;

 err = _wcsupr_s(lpsz,strMobileName_temp.GetLength()+1);//因为没有找到不区分大小写的查找子字符串的函数,所以决定转换成大写然后进行比较。

 pdest = wcsstr( lpsz,strCOOLPAD );

 if( pdest != NULL )

 {

   return TRUE;

 }

 else

 {

  return FALSE;

 }

}

1.string CString
CString.format(”%s”, string.c_str());
c_str()确实比data()要好;

2.char CString
CString.format(”%s”, char*);

3.char string
string s(char *);
只能初始化,在不是初始化的地方最好还是用assign().

4.string char *
char *p = string.c_str();

5.CString string
string s(CString.GetBuffer());
GetBuffer()
后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.

    
 
 
 
 
 
 
 
 
 
 
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值