CString类型如何变成char型?圣诞大派送! 圣诞快乐!!CString str;char* ch = (LPTSTR)(LPCTSTR)str; 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 另外提醒一下,sprintf()函数使用时需要注意char*指向的buffer是否够大,不够大的话会引起内存泄漏。 圣诞快乐!!CString str;char ch[256];strcpy(ch,(LPTSTR)(LPCTSTR)str; CString show = "fdjajfda";char *p = show.GetBuffer(show.GetLength());//do your action...show.ReleaseBuffer(); (LPCTSTR)str;(LPTSTR)(LPCTSTR)str; CString str;char *p;p = str.GetBuffer(str.GetLength());//...str.ReleaseBuffer(-1); CString strDisp;TCHAR sBuf[1024];_tcscpy(sBuf, (LPCTSTR)strDisp); 如果作为常数引用的话用(LPCTSTR)string,否则用string.GetBuffer(1)楼上eng(eng_llw)的方法可能更好,但我没试过。 CString tmp;Char chr[255];strcpy(chr,(LPCTSTR)tmp); 我们先定义一些常见类型变量借以说明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);二、从其它包含字符串的变量中获取指向该字符串的指针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与CComBSTRCComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上头文件comutil.h反之可以使用char *p=_com_util::ConvertBSTRToString(b);六、VARIANT 、_variant_t 与 COleVariantVARIANT的结构可以参考头文件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与常用数据的对应关系:unsigned char 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 IUnknown FAR* punkVal; VT_UNKNOWN IDispatch FAR* pdispVal; VT_DISPATCH SAFEARRAY FAR* parray; VT_ARRAY¦* unsigned char 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; VT_BYREF _variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。例如: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;七、其它对消息的处理中我们经常需要将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位 回复人: alphagx(alpha) (2001-11-23 17:18:46) 得0分 int 转变为char 可以用 itoa()char 转变为int atoi() 回复人: GrayWhite(灰白) (2001-11-23 17:44:36) 得0分 可以转换的类是进行了操作符重载,类型转化也是一种操作。 回复人: vjeymyf(vjeymyf) (2001-11-23 18:39:30) 得0分 uPupup 回复人: loop000(一天到晚游泳的鱼) (2001-11-23 18:41:10) 得0分 tk 回复人: fudy(windwolf) (2001-11-23 19:15:26) 得0分 sscanf和sprintf是很好用的两个函数,比如把23转化成16进制的字符串"17",就可以用: int i=23; char a[10]; sprintf(a,"0x%X",i); 回复人: xtky_limi(亲爱的,别急,我写完这个接口就来陪你!) (2001-11-23 19:24:56) 得0分 旁听 回复人: firehorizon(ldh) (2001-11-23 19:26:33) 得0分 学习! 回复人: ccnuxjg(阿木) (2001-11-23 19:28:25) 得0分 GetBuffer可把CString转换为char还有函数atoi()itoa()ltoa()可将字符型的与整形的相互转化 GetBuffer()RepleaseBuffer( ... ) lpstr=str.GetBuffer(0);str.ReleaseBuffer(); 不允许回复为空!!不允许有 gz、up!!!!来点创意吧!!!up 其它数据类型转换为字符串短整型(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: 0decimal表示小数点的位置,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); 给分了,各位能到http://www.csdn.net/Expert/topic/463/463534.shtm看看吗? 服务器如何接收CIF格式的视频流编码数据并保存到本地 有搞过编译器的朋友吗?请教个问题 在vc中如何定时? 基于对话框的mfc,如何把一个字符串显示到子对话框的控件中 那位知道WINDOWS操作系统最多支持多少个串口? 怎样获取对话框的句柄? 真名、网名和马甲 关于LCD的背光控制. 怎么关闭一个CFORMVIEW? 如何写一个表格控件类 请教三个macro:DECLARE/BEGIN/END_EVENTSINK_MAP ini文件里如何删去一个key?
CString str;
char ch[256];
strcpy(ch,(LPTSTR)(LPCTSTR)str;
//do your action
...
show.ReleaseBuffer();
(LPTSTR)(LPCTSTR)str;
char *p;
p = str.GetBuffer(str.GetLength());
//
.
.
.
str.ReleaseBuffer(-1);
TCHAR sBuf[1024];
_tcscpy(sBuf, (LPCTSTR)strDisp);
楼上eng(eng_llw)的方法可能更好,但我没试过。
Char chr[255];
strcpy(chr,(LPCTSTR)tmp);
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);
二、从其它包含字符串的变量中获取指向该字符串的指针
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 、_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与常用数据的对应关系:unsigned char 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
IUnknown FAR* punkVal; VT_UNKNOWN
IDispatch FAR* pdispVal; VT_DISPATCH
SAFEARRAY FAR* parray; VT_ARRAY¦*
unsigned char 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; VT_BYREF
_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
例如:
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;
七、其它对消息的处理中我们经常需要将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位
回复人: alphagx(alpha) (2001-11-23 17:18:46) 得0分
int 转变为char 可以用 itoa()
char 转变为int atoi()
回复人: GrayWhite(灰白) (2001-11-23 17:44:36) 得0分
可以转换的类是进行了操作符重载,类型转化也是一种操作。
回复人: vjeymyf(vjeymyf) (2001-11-23 18:39:30) 得0分
uPupup
回复人: loop000(一天到晚游泳的鱼) (2001-11-23 18:41:10) 得0分
tk
回复人: fudy(windwolf) (2001-11-23 19:15:26) 得0分
sscanf和sprintf是很好用的两个函数,比如把23转化成16进制的字符串"17",
就可以用:
int i=23;
char a[10];
sprintf(a,"0x%X",i);
回复人: xtky_limi(亲爱的,别急,我写完这个接口就来陪你!) (2001-11-23 19:24:56) 得0分
旁听
回复人: firehorizon(ldh) (2001-11-23 19:26:33) 得0分
学习!
回复人: ccnuxjg(阿木) (2001-11-23 19:28:25) 得0分
GetBuffer可把CString转换为char
还有函数
atoi()
itoa()
ltoa()
可将字符型的与整形的相互转化
RepleaseBuffer( ... )
str.ReleaseBuffer();
短整型(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);