您好,登錄后才能下訂單哦!
說明:本文純粹是總結一下有關類型轉換的貼子,
本人并未對所有方法都做測試,僅僅是為了給大家一個參考。
讀者層次:初學
int i = 100;
long l = 2001;
float f=300.2;
double d=12345.119;
char username[]="程佩君";
char temp[200];
char *buf;
CString str;
_variant_t v1;
_bstr_t v2;
一、其它數據類型轉換為字符串
短整型(int)
itoa(i,temp,10);///將i轉換為字符串放入temp中,最后一個數字表示十進制
itoa(i,temp,2); ///按二進制方式轉換
長整型(long)
ltoa(l,temp,10);
浮點數(float,double)
用fcvt可以完成轉換,這是MSDN中的例子:
int decimal, sign;
char *buffer;
double source = 3.1415926535;
buffer = _fcvt( source, 7, &decimal, &sign );
運行結果:source: 3.1415926535 buffer: '31415927' decimal: 1 sign: 0
decimal表示小數點的位置,sign表示符號:0為正數,1為負數
CString變量
str = "2008北京奧運";
buf = (LPSTR)(LPCTSTR)str;
BSTR變量
BSTR bstrValue = ::SysAllocString(L"程序員");
char * buf = _com_util::ConvertBSTRToString(bstrValue);
SysFreeString(bstrValue);
AfxMessageBox(buf);
delete(buf);
CComBSTR變量
CComBSTR bstrVar("test");
char *buf = _com_util::ConvertBSTRToString(bstrVar.m_str);
AfxMessageBox(buf);
delete(buf);
_bstr_t變量
_bstr_t類型是對BSTR的封裝,因為已經重載了=操作符,所以很容易使用
_bstr_t bstrVar("test");
const char *buf = bstrVar;///不要修改buf中的內容
AfxMessageBox(buf);
通用方法(針對非COM數據類型)
用sprintf完成轉換
char buffer[200];char c = '1';int i = 35;long j = 1000;float f = 1.7320534f;sprintf( buffer, "%c",c);sprintf( buffer, "%d",i);sprintf( buffer, "%d",j);sprintf( buffer, "%f",f);
二、字符串轉換為其它數據類型
strcpy(temp,"123");
短整型(int)
i = atoi(temp);
長整型(long)
l = atol(temp);
浮點(double)
d = atof(temp);
CString變量
CString name = temp;
BSTR變量
BSTR bstrValue = ::SysAllocString(L"程序員");
...///完成對bstrValue的使用
SysFreeString(bstrValue);
CComBSTR變量
CComBSTR類型變量可以直接賦值
CComBSTR bstrVar1("test");
CComBSTR bstrVar2(temp);
_bstr_t變量
_bstr_t類型的變量可以直接賦值
_bstr_t bstrVar1("test");
_bstr_t bstrVar2(temp);
三、其它數據類型轉換到CString
使用CString的成員函數Format來轉換,例如:
整數(int)
str.Format("%d",i);
浮點數(float)
str.Format("%f",i);
字符串指針(char *)等已經被CString構造函數支持的數據類型可以直接賦值
str = username;
對于Format所不支持的數據類型,可以通過上面所說的關于其它數據類型轉化到char *的方法先轉到char *,然后賦值給CString變量。
四、BSTR、_bstr_t與CComBSTR
CComBSTR 是ATL對BSTR的封裝,_bstr_t是C++對BSTR的封裝,BSTR是32位指針,但并不直接指向字串的緩沖區。
char *轉換到BSTR可以這樣:
BSTR b=_com_util::ConvertStringToBSTR("數據");///使用前需要加上comutil.h和comsupp.lib
SysFreeString(bstrValue);
反之可以使用
char *p=_com_util::ConvertBSTRToString(b);
delete p;
具體可以參考一,二段落里的具體說明。
CComBSTR與_bstr_t對大量的操作符進行了重載,可以直接進行=,!=,==等操作,所以使用非常方便。
特別是_bstr_t,建議大家使用它。
五、VARIANT 、_variant_t 與 COleVariant
VARIANT的結構可以參考頭文件VC98/Include/OAIDL.H中關于結構體tagVARIANT的定義。
對于VARIANT變量的賦值:首先給vt成員賦值,指明數據類型,再對聯合結構中相同數據類型的變量賦值,舉個例子:
VARIANT va;
int a=2001;
va.vt=VT_I4;///指明整型數據
va.lVal=a; ///賦值
對于不馬上賦值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);進行初始化,其本質是將vt設置為VT_EMPTY,下表我們列舉vt與常用數據的對應關系:
Byte bVal; | // VT_UI1. |
Short iVal; | // VT_I2. |
long lVal; | // VT_I4. |
float fltVal; | // VT_R4. |
double dblVal; | // VT_R8. |
VARIANT_BOOL boolVal; | // VT_BOOL. |
SCODE scode; | // VT_ERROR. |
CY cyVal; | // VT_CY. |
DATE date; | // VT_DATE. |
BSTR bstrVal; | // VT_BSTR. |
DECIMAL FAR* pdecVal | // VT_BYREF|VT_DECIMAL. |
IUnknown FAR* punkVal; | // VT_UNKNOWN. |
IDispatch FAR* pdispVal; | // VT_DISPATCH. |
SAFEARRAY FAR* parray; | // VT_ARRAY|*. |
Byte FAR* pbVal; | // VT_BYREF|VT_UI1. |
short FAR* piVal; | // VT_BYREF|VT_I2. |
long FAR* plVal; | // VT_BYREF|VT_I4. |
float FAR* pfltVal; | // VT_BYREF|VT_R4. |
double FAR* pdblVal; | // VT_BYREF|VT_R8. |
VARIANT_BOOL FAR* pboolVal; | // VT_BYREF|VT_BOOL. |
SCODE FAR* pscode; | // VT_BYREF|VT_ERROR. |
CY FAR* pcyVal; | // VT_BYREF|VT_CY. |
DATE FAR* pdate; | // VT_BYREF|VT_DATE. |
BSTR FAR* pbstrVal; | // VT_BYREF|VT_BSTR. |
IUnknown FAR* FAR* ppunkVal; | // VT_BYREF|VT_UNKNOWN. |
IDispatch FAR* FAR* ppdispVal; | // VT_BYREF|VT_DISPATCH. |
SAFEARRAY FAR* FAR* pparray; | // VT_ARRAY|*. |
VARIANT FAR* pvarVal; | // VT_BYREF|VT_VARIANT. |
void FAR* byref; | // Generic ByRef. |
char cVal; | // VT_I1. |
unsigned short uiVal; | // VT_UI2. |
unsigned long ulVal; | // VT_UI4. |
int intVal; | // VT_INT. |
unsigned int uintVal; | // VT_UINT. |
char FAR * pcVal; | // VT_BYREF|VT_I1. |
unsigned short FAR * puiVal; | // VT_BYREF|VT_UI2. |
unsigned long FAR * pulVal; | // VT_BYREF|VT_UI4. |
int FAR * pintVal; | // VT_BYREF|VT_INT. |
unsigned int FAR * puintVal; | //VT_BYREF|VT_UINT. |
_variant_t是VARIANT的封裝類,其賦值可以使用強制類型轉換,其構造函數會自動處理這些數據類型。
使用時需加上#include <comdef.h>
例如:
long l=222;
ing i=100;
_variant_t lVal(l);
lVal = (long)i;
COleVariant的使用與_variant_t的方法基本一樣,請參考如下例子:
COleVariant v3 = "字符串", v4 = (long)1999;
CString str =(BSTR)v3.pbstrVal;
long i = v4.lVal;
六、其它一些COM數據類型
根據ProgID得到CLSID
HRESULT CLSIDFromProgID( LPCOLESTR lpszProgID,LPCLSID pclsid);
CLSID clsid;
CLSIDFromProgID( L"MAPI.Folder",&clsid);
根據CLSID得到ProgID
WINOLEAPI ProgIDFromCLSID( REFCLSID clsid,LPOLESTR * lplpszProgID);
例如我們已經定義了 CLSID_IApplication,下面的代碼得到ProgID
LPOLESTR pProgID = 0;
ProgIDFromCLSID( CLSID_IApplication,&pProgID);
...///可以使用pProgID
CoTaskMemFree(pProgID);//不要忘記釋放
七、ANSI與Unicode
Unicode稱為寬字符型字串,COM里使用的都是Unicode字符串。
將ANSI轉換到Unicode
(1)通過L這個宏來實現,例如: CLSIDFromProgID( L"MAPI.Folder",&clsid);
(2)通過MultiByteToWideChar函數實現轉換,例如:
char *szProgID = "MAPI.Folder";
WCHAR szWideProgID[128];
CLSID clsid;
long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));
szWideProgID[lLen] = '/0';
(3)通過A2W宏來實現,例如:
USES_CONVERSION;
CLSIDFromProgID( A2W(szProgID),&clsid);
將Unicode轉換到ANSI
(1)使用WideCharToMultiByte,例如:
// 假設已經有了一個Unicode 串 wszSomeString...
char szANSIString [MAX_PATH];
WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL );
(2)使用W2A宏來實現,例如:
USES_CONVERSION;
pTemp=W2A(wszSomeString);
八、其它
對消息的處理中我們經常需要將WPARAM或LPARAM等32位數據(DWORD)分解成兩個16位數據(WORD),例如:
LPARAM lParam;
WORD loValue = LOWORD(lParam);///取低16位
WORD hiValue = HIWORD(lParam);///取高16位
對于16位的數據(WORD)我們可以用同樣的方法分解成高低兩個8位數據(BYTE),例如:
WORD wValue;
BYTE loValue = LOBYTE(wValue);///取低8位
BYTE hiValue = HIBYTE(wValue);///取高8位
兩個16位數據(WORD)合成32位數據(DWORD,LRESULT,LPARAM,或WPARAM)
LONG MAKELONG( WORD wLow, WORD wHigh );
WPARAM MAKEWPARAM( WORD wLow, WORD wHigh );
LPARAM MAKELPARAM( WORD wLow, WORD wHigh );
LRESULT MAKELRESULT( WORD wLow, WORD wHigh );
兩個8位的數據(BYTE)合成16位的數據(WORD)
WORD MAKEWORD( BYTE bLow, BYTE bHigh );
從R(red),G(green),B(blue)三色得到COLORREF類型的顏色值
COLORREF RGB( BYTE byRed,BYTE byGreen,BYTE byBlue );
例如COLORREF bkcolor = RGB(0x22,0x98,0x34);
從COLORREF類型的顏色值得到RGB三個顏色值
BYTE Red = GetRValue(bkcolor); ///得到紅顏色
BYTE Green = GetGValue(bkcolor); ///得到綠顏色
BYTE Blue = GetBValue(bkcolor); ///得到蘭顏色
九、注意事項
假如需要使用到ConvertBSTRToString此類函數,需要加上頭文件comutil.h,并在setting中加入comsupp.lib或者直接加上#pragma comment( lib, "comsupp.lib" )
后記:本文匆匆寫成,錯誤之處在所難免,歡迎指正.
關于把BSTR類型數據轉換成CString 類型數據時的問題?
當我在把BSTR類型數據轉換成CString 或 “char* 類型”數據時,發現在BSTR類型字符串較短的情況下沒問題,當較長時就會出現
內存讀寫錯了。(在NT,2000下都測試是這樣的。)
根據你所說:
1)字符串指針(char *)等已經被CString構造函數支持的數據類型 可以直接賦值 str = username;
2)當b 為BSTR類型時可以使用
char *p=_com_util::ConvertBSTRToString(b);
于是以下是對的:
CString cstr;
BSTR bstr;
....
cstr=com_util::ConvertBSTRToString(bstr);
...
可是當bstr非常大時(其實,較大時就會)就會出現內存讀寫錯,不知何故。
此外我發現cstr=com_util::ConvertBSTRToString(bstr);
可以簡化為 cstr=bstr; 但當bstr較大時同樣出現這個問題。
請兄弟幫忙!急。謝謝!
如何轉化((list*)fileip.bian)->liang
關于把CString轉化成LPCTSTR的問題 作者:jakiesun 發表日期:2001-9-5 20:08:48
我記的我以前寫過這樣一段代碼
void function()
{
CString str,str1,str2;
function((char*)(LPCTSTR)str1);
str=str1;
...//調試道此發現str2的值隨著str的改變而改變,請問能解釋一下為什么,如有回答,請通知
wangshaohong@sohu.com,tx先
}
添加lib支持 作者:磨刀霍霍 發表日期:2001-9-10 11:32:12
如果不添加會產生錯誤,在setting中加入comsupp.lib或者直接#pragma comment( lib, "comsupp.lib" )
微軟認為缺省的設置call convention如果不設置成__cdecl也會出現同樣的錯誤。
1。int 轉成cstring ??
回復人: caigzhi(caigzhi) (2001-10-17 11:27:35) 得0分
CString 的成員函數Format()
int a = 2131;
CString str;
str.Format("%d",a);
回復人: tenchi(C與C++之間) (2001-10-17 11:32:12) 得0分
int i=2001;
char str[10];
_itoa(i,str,10);
CString szString=str;
回復人: fiolin(幽深的水) (2001-10-17 11:45:40) 得0分
他們兩個的都可以!!
回復人: sohucsdnvc(thanks) (2001-10-17 13:24:17) 得0分
那如何把double轉成cstring
回復人: yihugang(小虎子) (2001-10-17 13:29:15) 得6分
int i = 2131;
char *c=new char[20];
CString str;
sprintf(c,'%d',i);
str=*c;
回復人: Gu_c_h(Gu) (2001-10-17 14:07:17) 得0分
用 _gcvt 下面是 msdn 的例子
Example
/* _GCVT.C: This program converts -3.1415e5
* to its string representation.
*/
#include <stdlib.h>
#include <stdio.h>
void main( void )
{
char buffer[50];
double source = -3.1415e5;
_gcvt( source, 7, buffer );
printf( "source: %f buffer: '%s'/n", source, buffer );
_gcvt( source, 7, buffer );
printf( "source: %e buffer: '%s'/n", source, buffer );
}
Output
source: -314150.000000 buffer: '-314150.'
source: -3.141500e+005 buffer: '-314150.'
回復人: Gu_c_h(Gu) (2001-10-17 14:49:56) 得6分
int a = -3.1415e5;
CString str;
str.Format("%f",a);
回復人: ruixp(銳劍) (2001-10-17 15:06:48) 得6分
CString 的成員函數Format()
int a = 2131;
CString str;
str.Format("%d",a);
2。基類對象怎么能轉換成派生類對象?
int CDaoListView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
lpCreateStruct->style |= LVS_REPORT |LVS_EDITLABELS;
if (CListView::OnCreate(lpCreateStruct) == -1)
return -1;
//////////// 創建ImageList;
CDaoViewApp * pApp = (CDaoViewApp *) AfxGetApp();
m_pImageList = new CImageList();
ASSERT(m_pImageList !=NULL);
m_pImageList->Create(16,16,TRUE,4,4);
m_pImageList->Add(pApp->LoadIcon(IDI_KEY));
m_pImageList->Add(pApp->LoadIcon(IDI_ICON4));
m_pImageList->Add(pApp->LoadIcon(IDI_ICON5));
CListCtrlEx& ctlList = (CListCtrlEx&) GetListCtrl();//我不懂的就這句,cListCtrlEx看下面的聲明。
ctlList.SetImageList (m_pImageList, LVSIL_SMALL) ;
////////////
return 0;
}
class CListCtrlEx : public CListCtrl//類cListCtrlEx定義。
{.....
}
class CDaoListView : public CListView//cDaoListView定義!
{
...
}
注:我的問題是GetListCtrl()返回的是一個cListCtrl對象的引用,怎么能把它轉換成一個它的派生類對象的引用?c++的類型轉換怎么支持?
回復貼子:
回復人: lhj(努力加油) (2002-1-29 18:56:06) 得0分
CListCtrlEx& ctlList = (CListCtrlEx&) GetListCtrl();
這是強制類型轉換,&表示是一個引用,lctList的值在這次賦值后不能被修改。
回復人: wwwsq(wwwsq) (2002-1-29 19:09:22) 得0分
建議你找本C++方面的書看看,VC雖然號稱可視,實際上C++基礎還是很重要的。
回復人: xcopy(xcopy) (2002-1-29 19:26:16) 得0分
用dynamic_cast()可以安全的轉換。
3。如何在CString和double之間轉換?要求轉換之后能保留小數點,保留正負號??
cstring::format(%.xe) x為精度位
回復人: pchaos(雜講) (2002-1-28 11:21:46) 得0分
CString str;
double db;
str = "123.456";
db = atof((LPCTSTR)str);
回復人: hgw111(hg) (2002-1-28 11:52:57) 得0分
CString -> double : atof
double ->CString :Format
回復人: pchaos(雜講) (2002-1-28 13:46:04) 得0分
CString str;
double db;
str = "123.456";
db = atof((LPCTSTR)str);
db = 777.999;
str.format("%e", db);
4。字符型要轉換成int??
atoi(str)
5。_bstr_t 到 unsigned int??
_bstr_t str;
unsigned int Length=6;
Length=Length-str.length();
6。VARIANT類型轉換問題?
我在使用MSCOMM中SetOutput()函數時
形參必須為VARIANT變量
如何將其它的數據類型轉換為VARIANT類型?
如:Cstring->VARIANT、 *char->VARIANT
我對VARIANT的類型結構體不太熟,請講詳細些(最好有范例),謝謝!
回復貼子:
回復人: vc_xiaoxin(小新) (2001-12-26 15:43:57) 得0分
VARIANT本身是一個復雜的結構,別的數據怎么轉呀?關注
回復人: mpg_liu(星仁) (2001-12-27 18:33:50) 得10分
定義一個VARIANT變量后,他應該是一個結構體變量,其中有一個成員是字符型的,給這個成員賦值
回復人: LLnju(LLnju) (2001-12-27 18:36:10) 得0分
實在不清楚嘛就用 _variant_t , COleVariant 這些東東嘛,很好用的啊
回復人: softarts(CDMA2000) (2001-12-27 18:41:32) 得10分
構造一個就行了。
VARIANT varXX;
CString strYY;
varXX.vt=VT_BSTR;
varXX.bstrVal = strYY.allocsysstring();
應該可以了。
回復人: softarts(CDMA2000) (2001-12-27 18:42:11) 得0分
我也覺得COleVariant要好用一些,呵呵,我都用它。
回復人: bobofu(有問題要問) (2001-12-27 19:32:18) 得10分
CString str;
_variant_t var;
var = _variant_t(str);
7。COleVarant 如何轉換為 CString?
CString 如何轉換為 char *
CString 如何轉換為 char[xx] ??
CString 如何轉換為 char * wsprintf或者=
CString 如何轉換為 char[xx] strcpy()
回復人: SecretGarden(天堂鳥) (2002-1-14 11:55:23) 得0分
COleVarant封裝了VAREANT類型。
VAREANT類型其實是個巨大地Union,里面自然有你
想要地unsigned char *類型。
CString地GetBuffer和Format可以實現你的后兩個問題
8。v_variant_t類型轉換成cstring
總提示我cstring未定義
程序如下
_variant_t vfirstname;//存儲的是數據庫中的數據
CString str;//提示出錯
vfirstname=pRs->GetCollect (_variant_t("Phone_Num"));
vfirstname.ChangeType (VT_BSTR);
str=vfirstname.bstrVal;//提示出錯
回復貼子:
回復人: hydnoahark(諾亞方舟) (2001-11-12 11:56:51) 得10分
>>CString str;//提示出錯
要求include <afx.h>并且設置Use run-time Library為Multithreaded
回復人: zhengyun_ustc(^-^) (2001-11-12 12:04:39) 得15分
CString未定義,說明你的工程沒有引用MFC!!
要想使你的工程支持MFC,請按照以下步驟作:
1:在你的stdafx.h的頭文件中加入:
#include "afxtempl.h"
這是一個囊括了MFC的集合定義的頭文件,有了它,你的工程就識別Cstring類了。
2:在你的工程設置中,在General頁中,選擇“MFC”為“Using MFC in a shared DLL”
OK,現在再編譯你的工程即可。
回復人: zhengyun_ustc(^-^) (2001-11-12 12:06:56) 得5分
_variant_t的bstrVal成員是BSTR類型。
它是一個指向一個OLECHART*的指針。
回復人: vickowang(小蒼) (2001-11-12 12:48:21) 得5分
(char *)_bstr_t(vfirstname)
回復人: smallfool(smallfool) (2001-11-12 13:52:54) 得4分
或許你還需要一個從UNICODE字符到ANSI字符的轉變函數
回復人: sun_1112(蕭) (2001-11-12 17:34:44) 得0分
謝謝大家
給我這么大的支持!:)
回復人: zhengyun_ustc(^-^) (2001-11-14 13:24:07) 得0分
用vickowang(小蒼)的意見可能會有問題,轉換出的字符串應該是亂碼。
因為(char *)轉換需要一個const的字符串資源,才能強制轉換。
所以應該:
_bstr_t bstrTemp = _bstr_t(vfirstname.bstrVal);
TCHAR szTemp[MAX_PATH];
szTemp = (char*)bstrTemp;
9。char * 轉換為TCHAR類型??
直接轉換,TCHAR相當于char了
char * s;
TCHAR * s1=(TCHAR *)s;
回復人: dysxq() (2001-12-21 21:26:25) 得0分
要看你的程序設置是ANSI還是UNICODE, 如果是ANSI,直接轉,如果是UNICODE,TCHAR相當于WCHAR, 要用mbstowcsz轉一下
回復人: xiaoxiaohan(蕭曉寒) (2001-12-21 23:52:17) 得0分
Unicode :寬字節字符集
1. 如何取得一個既包含單字節字符又包含雙字節字符的字符串的字符個數?
可以調用Microsoft Visual C++的運行期庫包含函數_mbslen來操作多字節(既包括單字節也包括雙字節)字符串。
調用strlen函數,無法真正了解字符串中究竟有多少字符,它只能告訴你到達結尾的0之前有多少個字節。
2. 如何對DBCS(雙字節字符集)字符串進行操作?
函數 描述
PTSTR CharNext ( LPCTSTR ); 返回字符串中下一個字符的地址
PTSTR CharPrev ( LPCTSTR, LPCTSTR ); 返回字符串中上一個字符的地址
BOOL IsDBCSLeadByte( BYTE ); 如果該字節是DBCS字符的第一個字節,則返回非0值
3. 為什么要使用Unicode?
(1) 可以很容易地在不同語言之間進行數據交換。
(2) 使你能夠分配支持所有語言的單個二進制.exe文件或DLL文件。
(3) 提高應用程序的運行效率。
Windows 2000是使用Unicode從頭進行開發的,如果調用任何一個Windows函數并給它傳遞一個ANSI字符串,那么系統首先要將字符串轉換成
Unicode,然后將Unicode字符串傳遞給操作系統。如果希望函數返回ANSI字符串,系統就會首先將Unicode字符串轉換成ANSI字符串,然后將結
果返回給你的應用程序。進行這些字符串的轉換需要占用系統的時間和內存。通過從頭開始用Unicode來開發應用程序,就能夠使你的應用程序
更加有效地運行。
Windows CE 本身就是使用Unicode的一種操作系統,完全不支持ANSI Windows函數
Windows 98 只支持ANSI,只能為ANSI開發應用程序。
Microsoft公司將COM從16位Windows轉換成Win32時,公司決定需要字符串的所有COM接口方法都只能接受Unicode字符串。
4. 如何編寫Unicode源代碼?
Microsoft公司為Unicode設計了WindowsAPI,這樣,可以盡量減少代碼的影響。實際上,可以編寫單個源代碼文件,以便使用或者不使用
Unicode來對它進行編譯。只需要定義兩個宏(UNICODE和_UNICODE),就可以修改然后重新編譯該源文件。
_UNICODE宏用于C運行期頭文件,而UNICODE宏則用于Windows頭文件。當編譯源代碼模塊時,通常必須同時定義這兩個宏。
5. Windows定義的Unicode數據類型有哪些?
數據類型 說明
WCHAR Unicode字符
PWSTR 指向Unicode字符串的指針
PCWSTR 指向一個恒定的Unicode字符串的指針
對應的ANSI數據類型為CHAR,LPSTR和LPCSTR。
ANSI/Unicode通用數據類型為TCHAR,PTSTR,LPCTSTR。
6. 如何對Unicode進行操作?
字符集 特性 實例
ANSI 操作函數以str開頭 strcpy
Unicode 操作函數以wcs開頭 wcscpy
MBCS 操作函數以_mbs開頭 _mbscpy
ANSI/Unicode 操作函數以_tcs開頭 _tcscpy(C運行期庫)
ANSI/Unicode 操作函數以lstr開頭 lstrcpy(Windows函數)
所有新的和未過時的函數在Windows2000中都同時擁有ANSI和Unicode兩個版本。ANSI版本函數結尾以A表示;Unicode版本函數結尾以W表示。
Windows會如下定義:
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif // !UNICODE
7. 如何表示Unicode字符串常量?
字符集 實例
ANSI “string”
Unicode L“string”
ANSI/Unicode T(“string”)或_TEXT(“string”)if( szError[0] == _TEXT(‘J') ){ }
8. 為什么應當盡量使用操作系統函數?
這將有助于稍稍提高應用程序的運行性能,因為操作系統字符串函數常常被大型應用程序比如操作系統的外殼進程Explorer.exe所使用。由于
這些函數使用得很多,因此,在應用程序運行時,它們可能已經被裝入RAM。
如:StrCat,StrChr,StrCmp和StrCpy等。
9. 如何編寫符合ANSI和Unicode的應用程序?
(1) 將文本串視為字符數組,而不是chars數組或字節數組。
(2) 將通用數據類型(如TCHAR和PTSTR)用于文本字符和字符串。
(3) 將顯式數據類型(如BYTE和PBYTE)用于字節、字節指針和數據緩存。
(4) 將TEXT宏用于原義字符和字符串。
(5) 執行全局性替換(例如用PTSTR替換PSTR)。
(6) 修改字符串運算問題。例如函數通常希望在字符中傳遞一個緩存的大小,而不是字節。這意味著不應該傳遞sizeof(szBuffer),而應該傳
遞(sizeof(szBuffer)/sizeof(TCHAR)。另外,如果需要為字符串分配一個內存塊,并且擁有該字符串中的字符數目,那么請記住要按字節來
分配內存。這就是說,應該調用malloc(nCharacters *sizeof(TCHAR)),而不是調用malloc(nCharacters)。
10. 如何對字符串進行有選擇的比較?
通過調用CompareString來實現。
標志 含義
NORM_IGNORECASE 忽略字母的大小寫
NORM_IGNOREKANATYPE 不區分平假名與片假名字符
NORM_IGNORENONSPACE 忽略無間隔字符
NORM_IGNORESYMBOLS 忽略符號
NORM_IGNOREWIDTH 不區分單字節字符與作為雙字節字符的同一個字符
SORT_STRINGSORT 將標點符號作為普通符號來處理
11. 如何判斷一個文本文件是ANSI還是Unicode?
判斷如果文本文件的開頭兩個字節是0xFF和0xFE,那么就是Unicode,否則是ANSI。
12. 如何判斷一段字符串是ANSI還是Unicode?
用IsTextUnicode進行判斷。IsTextUnicode使用一系列統計方法和定性方法,以便猜測緩存的內容。由于這不是一種確切的科學方法,因此
IsTextUnicode有可能返回不正確的結果。
13. 如何在Unicode與ANSI之間轉換字符串?
Windows函數MultiByteToWideChar用于將多字節字符串轉換成寬字符串;函數WideCharToMultiByte將寬字符串轉換成等價的多字節字符串。
回復人: xtky_limi(痛在心中笑在臉上) (2001-12-22 0:35:58) 得0分
上面說的已經比較全了。
回復人: xtky_limi(痛在心中笑在臉上) (2001-12-22 0:38:13) 得0分
TEXT是宏
相當于L##
它可以根據編譯環境確定為DBMS,還是UNICODE字符集
10。int類型轉換為CString類型?
回復人: tjmxf(天涯) (2001-12-17 19:59:34) 得0分
itoa()
回復人: zf925(天下哪來那么多高手) (2001-12-17 20:00:30) 得22分
char m[20];
str=str + itoa(i,m,10);
回復人: yuezifeng(wybzd) (2001-12-17 20:00:50) 得22分
CString str;
str.Format("%d",i);
回復人: kingfish(今飛) (2001-12-17 20:06:27) 得0分
str.Format("%s%d",str,i);
回復人: tanyajun(談子) (2001-12-17 20:09:25) 得0分
CString str="test";
int i=11;
CString str1;
str1.Format("%d",i);
str = str+str1;
回復人: guanjinke(綸巾客) (2001-12-17 20:10:42) 得0分
int i=11;
CString str="test";
CString addition;
addition.Format("%d",i);
str+=addition;
就可以了。
11。關于sprintf類型轉換的問題
sprintf(buf,"select price from ls01 where p_date>='%'",t_date)
其中t_date是CTime類型,%后面應該是什么呢?%s是String類型,%c是char,那么CTime型對應的是什么呢?
回復人: yakai(日落長河) (2001-12-17 17:45:47) 得0分
sprintf(buf,"select price from ls01 where p_date>='%S'",(LPCSTR)t_date.Format( "%A, %B %d, %Y" ));
如果不行,就
char temp[50];
CString str=t_date.Format( "%A, %B %d, %Y" );
strcpy(temp,(LPCSTR)str);
sprintf(buf,"select price from ls01 where p_date>='%S'",temp);
CTime::Format返回CString
回復人: loh(樂嘯天涯) (2001-12-17 17:52:57) 得0分
wait
don't know
回復人: masterz() (2001-12-17 20:21:05) 得0分
SQL語句中日期要寫成字符串"yyyymmdd"
12。類型轉換 unsigned int <==>CString??
回復次數:8
發表時間:2001-12-17 10:25:23
unsigned int f;//unsigned int 0~4294967295
CString g;
f=2300000000;
g.Format("%d",f);
AfxMessageBox(g);
出錯。
回復人: ydogg(灰毛兔頻頻) (2001-12-17 10:31:29) 得0分
unsigned int f;//unsigned int 0~4294967295
CString g;
f=2300000000;
g.Format("%d",f);
MessageBox(g);//使用AfxMessageBox,需要窗口的句炳參數
回復人: asdmusic8(asdmusic8) (2001-12-17 10:35:15) 得0分
我 AfxMessageBox(g); 和MessageBox(g); 都不錯。
錯的是g.從 2300000000=》1994967296
回復人: asdmusic8(asdmusic8) (2001-12-17 10:36:10) 得0分
是2300000000=》-1994967296 類型轉換錯。
回復人: ydogg(灰毛兔頻頻) (2001-12-17 10:37:54) 得6分
g.Format("%u",f);
回復人: asdmusic8(asdmusic8) (2001-12-17 10:40:24) 得0分
to dgsnmpoperate 那怎么從 CString ==>>unsigned int
回復人: kingfish(今飛) (2001-12-17 10:42:10) 得6分
既然是 unsigned int,
超過 0x7f000000 (2130706432) 當然不能用 %d (signed int)用%u
回復人: kingfish(今飛) (2001-12-17 10:44:57) 得8分
CString ==>>unsigned int
char *p = (LPSTR)(LPCSTR) g;
f = atoi(p);
13。static_cast、dynamic_cast 和直接類型轉換(如 (void *)p )的區別?
發表時間:2001-12-14 9:31:13
先拷貝MSDN中的一小段話:
class B { ... };
class C : public B { ... };
class D : public C { ... };
void f(D* pd)
{
C* pc = dynamic_cast<C*>(pd); // ok: C is a direct base class
// pc points to C subobject of pd
B* pb = dynamic_cast<B*>(pd); // ok: B is an indirect base class
// pb points to B subobject of pd
...
}
我已經知道 static_cast 和 dynamic_cast 的作用,但MSDN中并沒有提到這兩個操作符與直接類型轉換如
void f(D* pd)
{
C* pc = (C*)(pd);
B* pb = (B*)(pd);
...
}
的不同啊。不知道那位知道的告訴一聲,在此不勝感謝,50分奉上。
回復貼子:ysdesigned(清泉) (2001-12-14 10:03:07) 得0分
static_cast、dynamic_cast 代 替 簡 單 的 強 制 轉 化, 從 而 消 除 多 繼 承 帶 來 的 歧 義。 使 用 這 兩 個 運 算 符 號, 我 們可以 在 對 象 運 行 過 程 中 獲 取 對 象 的 類 型 信 息
dynamic_cast 用于多態類型的轉換
static_cast 用于非多態類型的轉換
回復人: masterz() (2001-12-14 10:05:48) 得0分
static_cast<...>compile時能發現不正確的指針類型轉換
dynamic_cast<...>運行時如果發現是不正確的指針類型轉換會返回NULL
(void*)強制轉換,如果是不正確的指針類型轉換,沒有辦法檢查,不如上面2中安全
回復人: meady() (2001-12-14 11:29:05) 得0分
類型安全
回復人: bluecrest(為什么我的VC還是那么的菜) (2001-12-14 11:45:34) 得0分
com技術內幕介紹過
我剛看完就忘了
14。byte數據類型轉換成int型??
我用byte型讀進一組數據想把他轉成int型進行運算如何做呢?
如果再把int型轉回byte又怎么實現呢?
回復人: louifox(蘭陵笑笑生) (2001-12-6 9:18:38) 得0分
用下面這些宏:
WORD MAKEWORD(
BYTE bLow,
BYTE bHigh
);
BYTE LOBYTE(
WORD wValue
);
BYTE HIBYTE(
WORD wValue
);
回復人: chskim(大刀闊斧) (2001-12-6 9:21:04) 得0分
int i;
BYTE b;
b=128;
i=(int)b;
回復人: nannet(似的) (2001-12-6 9:38:24) 得0分
這個宏怎么用呀?有沒有簡單一點兒的,我現在能把BYTE 轉成INT 型了,再轉回去直接賦值可以嗎?
回復人: louifox(蘭陵笑笑生) (2001-12-6 9:46:24) 得20分
WORD wa;
BYTE ba=32,bb=64;
wa=MAKEWORD(ba,bb);
...
WORD wa=1234;
BYTE ba,bb;
ba=LOBYTE(wa);
bb=LOBYTE(wa);
回復人: nannet(似的) (2001-12-6 9:54:55) 得0分
問題解決了,多謝各位
15。類型轉換的問題,unsigned int --> lptstr/lpctstr??
發表時間:2001-8-7 23:49:41
如果強制轉換的話,會出現致命錯誤,有什么好的辦法呢?
能列舉一些其他的辦法嗎?
謝謝大蝦!
回復人: AlphaOne(總是第一個倒下) (2001-8-8 0:02:43) 得5分
你為什么要強行轉換呢?
如果你是要把int 的值作為 lptstr/lpctstr 的內容的話,
可以用CString:
unsigned int a = 100;
LPCTSTR lpText;
CString str;
str.Format("%d",a);
lpText = (LPCTSTR)str;
回復人: tryibest(編の魂) (2001-8-8 8:20:20) 得5分
wsprintf(str,"%u",ui);
回復人: zzh() (2001-8-8 9:04:39) 得5分
這種情況不需要進行強制轉換,直接使用wsprintf就可以了。
回復人: GJA106(中文字符) (2001-8-8 10:10:51) 得5分
unsigned int m_na=22;
LPTSTR lptstr;
wsprintf(lptstr,"%u",m_na);
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。