您的位置:首页 > 其它

CString和string区别

2013-10-11 22:52 190 查看
CString,是ATL/MFC共享的, string是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<c_str(); //并没有通过malloc或者new为指针ptmp分配内存,只是把string中的数据指针赋给了ptmp而已cout<<"Get the string->cstr is:"<<ptmp<copy(p,pstr->length(),0); //如果没有上面分配内存空间,这个语句在运行时就会报段错误。 cout<<"char * p:copy from string is:"<<p<<endl; //正确的输出了字符串Hello worldCString类型字符串对象转换成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; }}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: