(zz)CStringクラスとstringクラスの比較と応用

5214 ワード

最近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の中の1つのクラスであるため,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クラスには次の3つの方法があります.
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;
 }
}