string和CString 的比較

string和CString 的比較

 (一) 概述
  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
  查找指定值

 

 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

  
  insert
  Insert

 

 

接上篇...
  (八) MFC中常用字符串結構圖(此非比較,但爲了方便查閱就一併算在這兒了)
  


  (九) 總結
  綜上所述,我個人認爲,在MFC、ATL中使用字符串儘量使用CString,畢竟都是微軟的孩子,各方面都比其它更有優勢,而在非微軟平臺上或對移植性要求較高的場合推薦使用string,標準模板庫提供了那麼強大的泛型算法,沒必要再自己去造車輪。
  (十) 參考文獻
  主要參考的是MSDN,就不一一列出了。
  
  最後,限於本人水平,以上所述未必正確,敬請斧正。謝謝閱讀。

 

方法一:
CString m_str(_T("qwerg"));
char *chr=new char[m_str.GetLength()+1];
WideCharToMultiByte(CP_ACP,0,m_str.GetBuffer(),-1,chr,m_str.GetLength()+1,NULL,NULL);
string str=chr;
cout<<str;
方法二
CString str = _T("ooqoqoq"); 
setlocale(LC_ALL, "chs");
char *p = new char[str.GetLength()+1];
wcstombs(p,str,str.GetLength()+1);
string m_fileName = p;
cout<<m_fileName;


發佈了87 篇原創文章 · 獲贊 6 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章