VC数据类型转换大全 (转)

2023-11-03

VC数据类型转换大全

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
例如:
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
#include

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 并且设置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
Tags: cstring , char , const
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VC数据类型转换大全 (转) 的相关文章

随机推荐

  • 独家

    作者 Orhan G Yal n 翻译 欧阳锦 校对 詹好 本文约2300字 建议阅读6分钟 本文通过对OpenAI新发表的关于基于GPT 3的DALL E新模型的概括介绍 让读者对这个表现惊人的模型有了初步的了解 与此同时 作者也对该模型
  • Unable to parse expires attribute

    菜鸟错误大全 八 我们都是从新手一步一个坑踩过来的 下面我们来讲讲会遇到的常见错误和解决办法 Unable to parse expires attribute Thu 处理 加上这一句 HttpClient httpClient new
  • 图片服务器Zimg

    若一个项目中图片的资源较多 都会有专门的图片服务器来存储图片 可以去观察一些大的网站上图片的链接都是有专门的服务器 这样可以很好地提高性能 图片服务器解决方案很多 通过花钱的云厂商提供的存储服务 vsftp FastDFS等 这里介绍一个开
  • Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

    介绍new Thread的弊端及Java四种线程池的使用 对Android同样适用 1 new Thread的弊端 执行一个异步任务你还只是如下new Thread吗 new Thread new Runnable Override pub
  • ElasticSearch 排序

    1 相关性排序 ElasticSearch为了按照相关性来排序 需要将相关性表示为一个数值 在 Elasticsearch 中 相关性得分 由一个浮点数进行表示 并在搜索结果中通过 score 参数返回 默认排序是 score 降序 GET
  • 【Linux多线程编程-自学记录】03.主线程与子线程生命周期

    Linux多线程编程学习代码记录 代码已上传gitee 点个Star也不错哦 https gitee com chenshao777 linux thread git Linux多线程编程 自学记录 01 线程ID与进程ID 02 创建线程
  • Debian/Ubuntu升级B-B-R教程

    安装 系统要求 Debian Ubuntu系统 内核版本v4 9 3 v4 12 x 得安装gcc Makefile默认只支持gcc 6 你可以修改它 例如 gcc 4 9 1 更换内核并开启BBR 这里手动安装 方法从BBR刚出来时就在博
  • 項目管理

    刚开始拿到一个项目后工作的执行顺序 其实作为一个管理者 难道一个项目后有很多的工作要做 1 wbs 2 难点的调查 1 将项目分解 分解到最细 能分配到每个人的手中的细度为止 标注每个工作包的难易程度 依据每个人的能力和工作的难易程度进行分
  • 莫圣宏:3.30今天黄金操作建议及晚间盘面行情分析

    现在的你是不是还在迷茫中 无论行情暴涨 暴跌 单边还是震荡 你是不是总是没把握住 就是所谓的一买就跌 一跌就割 一割就涨 一涨就追 一追又套 一套再割 这就像一个死套 资金不断缩水 如此循环 如果你处在这样的循环中 请停下来好好想想 总结一
  • 在centos上使用openswan搭建IPSec***

    背景 因公司业务逐渐迁移到阿里云上 所以有需求搭建一条从公司内容到阿里云的 隧道 因环境限制并未有 设备可以使用 所以计划在linux上搭建ipsec 来实现该功能 拓扑图如下 目的 在阿里云服务器172 16 0 11和公司服务器192
  • 华为od机考真题-HJ64-MP3光标位置(中等)

    while 1 try count int input command input if count lt 4 base
  • c++字符串中的字符替换

    include
  • C#:MSB4086:在条件“condition”中,尝试对计算结果为“value”而不是数字的“expression”进行数值比较

    C MSB4086 在条件 condition 中 尝试对计算结果为 value 而不是数字的 expression 进行数值比较 如果条件表达式中需要数字 但该表达式的计算结果为非数值 则 MSBuild 项目文件中会出现此错误 如果项目
  • Shuffle'm Up【模拟】

    题目链接 POJ 3087 题意 给你两刀牌 第一刀是s1 第二刀是s2 然后有目标的理牌的最终形态S12 现在给出理牌的规则 理牌规则 假设s1 123 s2 456 则第一次理牌之后 S 415263 然后新的s1 415 新的s2 2
  • Oauth2授权模式访问之授权码模式(authorization_code)访问

    Oauth3授权模式访问之授权码模式 authorization code 访问 获取code redirect uri可以随便写 在浏览器输入 注意是get请求方式 http localhost 8080 oauth authorize
  • 【U8+】使用天联高级版客户端登录用友U8,指定U8服务器地址。

    问题描述 当使用U8客户端电脑作为天联高级版软件服务器的时候 即 U8应用服务器和远程服务器不是同一台电脑 每次新建天高用户后 新的天高用户 登录天高客户端后并打开U8登录界面 用友U8的登录窗口服务器地址即为天高服务器的计算机名称 而不是
  • chatgpt 优秀项目

    chagpt token 获取 点击即可 一 pandala 项目 仓库地址 pandora docker 部署方案 拉取镜像 docker pull pengzhile pandora 本地启动镜像 docker run d name c
  • python使用kafka收发消息

    简介 kafka是最近几年很流行的消息队列中间件 在大数据以及后端服务领域有很广泛的应用 废话不多说 接下来直接上代码介绍python如何向kafka发送数据以及订阅数据 消息发布 Kafka的消息是 发布 订阅 模式的 接下来先介绍向ka
  • android二级listview列表实现代码(高仿大众点评)

    今天来实现以下大众点评客户端的横向listview二级列表 先看一下样式 这种横向的listview二级列表在手机软件上还不太常见 但是使用过平板的都应该知道 在平板上市比较常见的 可能是因为平板屏幕比较大 而且也能展现更多的内容 下面来看
  • VC数据类型转换大全 (转)

    VC数据类型转换大全 int i 100 long l 2001 float f 300 2 double d 12345 119 char username 程佩君 char temp 200 char buf CString str v