最近在做一些關於VC的ActiveX小外掛程式,經常會遇到字串處理的問題,狂查CSDN和MSDN,結果並不理想。先說明一下,相關處理函數在VC++6.00測試通過。也許很多人不能理解,現在都什麼年代了,還用VC6.0,其實VC開發外掛程式有一個好處就是部署的時候方便一些,不用考慮瀏覽器端使用者是否安裝了.net Framework。那個.net Framework隨著推出新版本越來越大,要讓使用者花那麼多時間去安裝那個龐然大物,而實際用到的東西卻很少很少,這樣很多人會不乾的。另外,服務端的是java開發的,要加上.net更加不可能。因此,VC開發的東西就不用擔心這些東西。說多了。。。。。
在VC編程中經常會遇到字串轉化的問題,現在做一下總結,以方便以後使用。
(1) char*轉換成CString
若將char*轉換成CString,除了直接賦值外,還可使用CString::Format進行。例如:
char chArray[] = "Char test";
TCHAR * p = _T("Char test");( 或LPTSTR p = _T("Char test");)
CString theString = chArray;
theString.Format(_T("%s"), chArray);
theString = p;
(2) CString轉換成char*
若將CString類轉換成char*(LPSTR)類型,常常使用下列三種方法:
方法一,使用強制轉換。例如:
CString theString( (_T("Char test "));
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;
方法二,使用strcpy。例如:
CString theString( (_T("Char test "));
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString);
需要說明的是,strcpy(或可移值的_tcscpy)的第二個參數是 const wchar_t* (Unicode)或const char*
(ANSI),系統編譯器將會自動對其進行轉換。
方法三,使用CString::GetBuffer。
如果你需要修改 CString 中的內容,它有一個特殊的方法可以使用,那就是 GetBuffer,它的作用是返回一個可寫的緩衝指標。
如果你只是打算修改字元或者截短字串,例如:
CString s(_T("Char test "));
LPTSTR p = s.GetBuffer();
LPTSTR dot = strchr(p, ''.'');
// 在這裡添加使用p的代碼
if(p != NULL)
*p = _T('\0');
s.ReleaseBuffer(); // 使用完後及時釋放,以便能使用其它的CString成員函數
在 GetBuffer 和 ReleaseBuffer 之間這個範圍,一定不能使用你要操作的這個緩衝的 CString 對象的任何方法。因為
ReleaseBuffer 被調用之前,該 CString 對象的完整性得不到保障。
其他常規轉換
先定義一些常見類型變數藉以說明
int i = 100;
long l = 2001;
float f=300.2;
double d=12345.119;
char username[]="xx";
char temp[200];
char *buf;
CString str;
一、其它資料類型轉換為字串
短整型(int)
itoa(i,temp,10); /將i轉換為字串放入temp中,最後一個數字表示十進位
itoa(i,temp,2); //按二進位方式轉換
長整型(long)
ltoa(l,temp,10);
二、從其它包含字串的變數中擷取指向該字串的指標
CString變數
str = "2008北京奧運";
buf = (LPSTR)(LPCTSTR)str;
BSTR類型的_variant_t變數
v1 = (_bstr_t)"程式員";
buf = _com_util::ConvertBSTRToString((_bstr_t)v1);
三、字串轉換為其它資料類型
strcpy(temp,"123");
短整型(int)
i = atoi(temp);
長整型(long)
l = atol(temp);
浮點(double)
d = atof(temp);
四、其它資料類型轉換到CString
使用CString的成員函數Format來轉換,例如:
整數(int)
str.Format("%d",i);
浮點數(float)
str.Format("%f",i);
字串指標(char *)等已經被CString建構函式支援的資料類型可以直接賦值
str = username;
五、BSTR、_bstr_t與CComBSTR
CComBSTR、_bstr_t是對BSTR的封裝,BSTR是指向字串的32位指標。
char *轉換到BSTR可以這樣: BSTR
b=_com_util::ConvertStringToBSTR("資料");
//使用前需要加上標頭檔comutil.h
反之可以使用char *p=_com_util::ConvertBSTRToString(b);
六、variant轉化為CString
VariantToString(_variant_t varValue)
{
if(varValue.vt!=VT_BSTR)
{
varValue.ChangeType(VT_BSTR);
}
return (char*)_bstr_t(varValue.bstrVal);
}
注意:加上標頭檔 #include "comdef.h"
Variant 轉化為Long方法
VariantToLong(const VARIANT &var){ long r; switch(var.vt) { case VT_UI2://USHORT r = var.uiVal; break; case VT_UI4://ULONG r = var.ulVal; break; case VT_INT://INT r = var.intVal; break; case VT_UINT://UINT r = var.uintVal; break; case VT_I4://LONG r = var.lVal; break; case VT_UI1://BYTE r = var.bVal; break; case VT_I2://SHORT r = var.iVal; break; case VT_R4://FLOAT r = (long)var.fltVal; break; case VT_R8://DOUBLE r = (long)var.dblVal; break; default: r = -1;//無法轉換該值 break; } return r;}