(zz)CStringクラスと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:"<
違い:
(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;
}
}