Visual C++ 常用数据类型转换方法详解

 更新时间:2017年06月25日 18:47:48   作者:linuslinux  
本文纯粹是总结一下有关类型转换的贴子,需要的朋友可以参考下

16。关于COM类型转换问题??
我定义了两个变量,一个是void *piaRef=new unsigned char[1000];另一个是m_Temp=new CComVariant();我的问题是如何将piaRef中的值
COPY到m_Temp中。

回复人: nichang() (2001-11-21 15:34:04) 得0分
CComBSTR bsRef=piaRef;
m_Temp=bsRef.copy()
回复人: VincentChin(瘟神) (2001-11-21 17:04:24) 得0分
CComBSTR bsRef=piaRef;
//error C2440: 'initializing' : cannot convert from 'void *' to 'class ATL::CComBSTR'
m_Temp=bsRef.copy();
//error C2440: '=' : cannot convert from 'unsigned short *' to 'class ATL::CComVariant *'
回复人: nichang() (2001-11-21 17:14:28) 得0分
将void*改为unsigned char *
回复人: VincentChin(瘟神) (2001-11-21 17:22:22) 得0分
我用CComBSTR bsRef=(unsigned char*)piaRef,也不行吗?
回复人: VincentChin(瘟神) (2001-11-21 17:28:06) 得0分
会报错:
error C2440: 'type cast' : cannot convert from 'unsigned char *' to 'class ATL::CComBSTR'
回复人: nichang() (2001-11-22 9:12:14) 得0分
m_Temp=::SysAllocString((OLECHAR *)piaRef)
回复人: VincentChin(瘟神) (2001-11-22 10:43:07) 得0分
//error C2440: '=' : cannot convert from 'unsigned short *' to 'class ATL::CComVariant *'
回复人: VincentChin(瘟神) (2001-11-22 11:22:35) 得0分
m_Temp=new CComVariant(::SysAllocString(OLECHAR *)piaRef));没有出错,但是我的m_Temp是COM组件中的一个PROPERTY,我想返回的是
unsigned char类型(单字节),但经过上述转换后,就不再是单字节了呀!怎么办?
回复人: jiangsheng(蒋晟) (2001-11-22 11:36:58) 得0分
把这个属性的类型改成BSTR
回复人: GrayWhite(灰白) (2001-11-22 12:01:09) 得0分
m_Temp = new CComVariant((char*) piaRef);就可以了。VB就是用的BSTR,你要给谁用阿?VC不用VARIANT的。
回复人: GrayWhite(灰白) (2001-11-22 12:18:18) 得19分
哦,我明白了,你要各字节数组:
SAFEARRAY *psa = SafeArrayCreateVector(VT_UI1, 0, 1000);
if (!psa)
_com_issue_error(ERROR_NOT_ENOUGH_MEMORY);

HRESULT hr
for (long i = 0; i < 2; i ++)
{
if (FAILED (hr = SafeArrayPutElement(psa, &i, piaRef + i)))
_com_issue_error(hr);
}

_variant_t va; // include <comdef.h>
va.vt = VT_ARRAY | VT_UI1;
va.parray = psa;

m_Temp = new CComVariant(va);
回复人: VincentChin(瘟神) (2001-11-22 14:21:08) 得0分
SafeArrayPutElement(psa, &i, piaRef + i)
//error C2036: 'void *' : unknown size
回复人: VincentChin(瘟神) (2001-11-22 14:46:05) 得0分
To GrayWhite:为什么要for(long i=0;i<2;i++)?
回复人: nichang() (2001-11-22 15:16:35) 得0分
到底你想怎样转换嘛,是将数组内的值拷贝到CComVariant中存为字符串吗?
回复人: VincentChin(瘟神) (2001-11-22 15:28:35) 得0分
我是想把piaRef中的值照原样返回给其它程序使用。我正在做的是一个COM组件。谢谢各位!
回复人: nichang() (2001-11-22 15:34:40) 得10分
unsigned char *s=new unsigned char[1000];
strcpy((char*)s,"1234");//可以用你自己方法设置s中的值。
BSTR bstrS;
oleS=A2WBSTR((char*)s);//将char*转换成BSTR类型

CComVariant comVT;
comVT=oleS;//将BSTR转成CComVariant,这里一步也可,comVT=A2WBSTR((char*)s);

回复人: VincentChin(瘟神) (2001-11-22 16:54:07) 得0分
谢谢你!
但我还有一个问题,就是如果在s中有'/0'之类的东西我该怎么返回呢?char *遇到'/0'会认为到头了。完整的设计是这样的,我定义一个void * 用来从一个外部设备获取数据,该数据应该是unsigned char,我想把这个返回的数据作为属性传出,让其它应用使用(如VB)。
回复人: nichang() (2001-11-22 17:18:09) 得0分
将'/0'转换成其它如'/1'就OK了,
回复人: jiangsheng(蒋晟) (2001-11-22 18:07:16) 得0分
用字符串数组
回复人: VincentChin(瘟神) (2001-11-23 15:54:39) 得0分
谢谢各位的回复!我的问题解决了!如下:
SAFEARRAY *psa = SafeArrayCreateVector(VT_UI1, 0, 1000);
if (!psa)
return S_FALSE;
HRESULT hr;
for (long i = 0; i < 1000; i ++)
if (FAILED (hr = SafeArrayPutElement(psa, &i, ((unsigned char*)piaRefTemplate) + i)))
return S_FALSE;
VARIANT va;
va.vt = VT_ARRAY | VT_UI1;
va.parray = psa;
CComVariant *m_Temp = new CComVariant();
m_Temp->Copy(&va);

17。类型转换 static_cast reinterprete_cast 的区别??
static_cast reinterprete_cast 的区别

回复人: tar(GPS) (2001-11-21 10:06:41) 得0分
static_cast会检查转换类型健的相关性
如果没有的画会有编译错误
reinterprete_cast就是硬转了
回复人: tigerwoods(tao) (2001-11-21 12:28:19) 得0分
是否可以这样理解:在多重继承中,static_cast可实现对象指针的移动,从而指向正确的父类对象部分,而reinterprete_cast不作偏移?
回复人: liu_feng_fly(我恨死驱动程序了,哎,就是为了混口饭吃) (2001-11-21 12:35:14) 得0分
在多重继承中可以用dynamic_cast啊

18。那如何取得CString中的字符串??
回复人: nichang() (2001-11-5 17:06:00) 得0分
=(LPCTSTR)CString变量
回复人: snake1122(领悟) (2001-11-5 17:12:16) 得0分
方法太多了:
GetAt,Left,Mid,Right等等,就看你怎么取了!
回复人: dusb(保时捷) (2001-11-5 17:34:29) 得0分
可是不管是GetAt,Left,Mid,Right返回类型都是CString,还是不能用,我是要取其中的字符串,奇怪的是,VC中没有string类型。(我要的字符串是给树型控件中的分支名称)
回复人: Alps_lou(云飞扬) (2001-11-5 17:41:36) 得0分
有string类型的啊,要包含<string>
回复人: luxes() (2001-11-5 17:42:19) 得0分
加上(LPCTSTR),相当于一个const char *了,还不能用?
回复人: wt007(tt) (2001-11-5 17:48:33) 得0分
GetBuffer
回复人: espon99() (2001-11-5 17:54:06) 得20分
(LPSTR)(LPCTSTR)

回复人: ineedyou(古寺僧) (2001-11-5 17:59:29) 得0分
...m_str.GetBuffer(needlen)...;
....
m_str.ReleaseBuffer()
回复人: dusb(保时捷) (2001-11-6 15:08:36) 得0分
espon99大侠,果然是绝招,不过能否解释一下啊?

19。如何从CString类型转换为Unicode string 类型?
回复人: ychener(贫血) (2001-10-20 10:28:48) 得0分
CString本身就支持Unicode的。
只要你选择的是UniCode编译,生成的可执行程序就是支持UniCode的

回复人: ychener(贫血) (2001-10-20 10:30:04) 得0分
CString类是自适应的就像TCHAR一样,如果你定义了UniCode宏 就会以UniCode编译

回复人: xjl1980_81(阿龙) (2001-10-20 10:35:16) 得0分
不是呀,我有个函数中有一个参数需Unicode string 类型的,比如应该填L"abc",而且引号中的内容要有变化,现在我有一个 temp变量,是CString类型的,如何用呀?
回复人: xt_jat(桑巴) (2001-10-20 10:39:37) 得0分
_T()
_TEXT()
行不行?
回复人: xjl1980_81(阿龙) (2001-10-20 10:43:18) 得0分
不行
回复人: Jeffery__Chen() (2001-10-20 11:04:53) 得0分
强制转化:
CString temp;
WCHAR wTemp = (WCHAR)temp;
回复人: xjl1980_81(阿龙) (2001-10-20 11:37:06) 得0分
to:Jeffery__Chen() 
不对呀,出现不能转换的错误
回复人: hongzhh(关儿) (2001-10-20 11:39:42) 得0分
问题是这样的:
temp 是 CString类型变量,值为zhh
现在有一个API
PCCERT_CONTEXT WINAPI CertFindCertificateInStore(
HCERTSTORE hCertStore,
DWORD dwCertEncodingType,
DWORD dwFindFlags,
DWORD dwFindType,
const void *pvFindPara, //此处用 L"zhh" 没问题
//请问怎么转换 可以 用temp

PCCERT_CONTEXT pPrevCertContext
);

在此谢谢大家,请帮忙看看

回复人: hongzhh(关儿) (2001-10-20 13:27:10) 得0分
WCHAR wszDomain[256];
MultiByteToWideChar( CP_ACP, 0, temp,
strlen(temp)+1, wszUserName,
sizeof(wszUserName)/sizeof(wszUserName[0]) );


wszUserName就是转换后的值

回复人: ychener(贫血) (2001-10-23 11:43:05) 得0分
只要你用的是CString的函数就行的,如果你要用类似strcpy函数时,看看MSDN中一般情况下都有响应的函数对于Unicode的。只要换成_tcscpy等等。
回复人: ychener(贫血) (2001-10-23 11:44:10) 得0分
你有没有定义Unicode宏? 
20。请问在用ATL且不支持MFC的组件开发中,如何将从数据库中读到的DATE数据类型转换回为字符串??

复人: zhxuys(zhxuys) (2001-9-24 10:36:47) 得0分
ATL把datetime类型的列映射为DBTIMESTAMP类型,可取出该类型的year、month、day等,然后将这些数据传递回客户端,在客户端用CTime来构造
回复人: YUANXU(旭) (2001-9-24 11:18:14) 得0分
to zhxuys:CTime是MFC类,在ATL 不支持MFC时不能用。DATE其实质是个double*
回复人: zhxuys(zhxuys) (2001-9-24 11:57:01) 得0分
你在客户端与服务器端只用ATL规定的数据类型或VARIANT类型,而在客户端,可以用MFC来重新构造想要的数据结构

21。类型转换,CString to wchar_t ??

CString ss("aabb");
wchar_t* cc;
cc=ss.AllocSysString();

22。如何将CString类型转换为_bstr_t类型?
回复人: wei97081116(韦小宝) (2001-9-4 11:19:30) 得20分
CString b;
_bstr_t a;
a=(_bstr_t)b;

回复人: zhaozhen1212(赵振) (2001-9-18 1:30:18) 得0分
_bstr_t a=b.AllocSysString();;

23。如何把一个CString类型转换成一个普通的字符串,如char*?

回复人: liu_feng_fly(我恨死驱动程序了,哎,就是为了混口饭吃) (2001-9-17 18:00:52) 得0分
所以,直接用就可以,因为类里边有这样的转换函数
回复人: ydogg(灰毛兔频频) (2001-9-17 18:01:21) 得0分
CString show;

char *p = show.GetBuffer(show.GetLength());
回复人: jiangping_zhu(娜可露露之风之刃) (2001-9-17 18:02:05) 得0分
(char*)(LPCTSTR)str
回复人: bmouse(老鼠) (2001-9-18 0:10:56) 得0分
同意楼上!
回复人: bmouse(老鼠) (2001-9-18 0:13:22) 得0分
你还可以通过GetBuff来直接操作CString的缓冲区,不过要记着释放缓冲区.

24。CString 类型转换成 unsigned char类型吗??
回复人: LJN(*)风流倜傥无人及,玉树偏又临风立(*) (2001-9-17 12:46:01) 得0分
可以用CString.GetBuffer函数
回复人: xpmao() (2001-9-17 13:09:09) 得0分
CString strWork;
MessageBox(0,(LPSTR)strWork,0,0);
或MessageBox(0,strWork.GetBuffer(0),0,0);

回复人: sandd(降龙掌) (2001-9-17 13:17:32) 得0分
CString string;

(LPCTSTR)string;
回复人: jeff_hunter(PandaLee) (2001-9-17 13:45:30) 得0分
(unsigned char *)(LPCTSTR)
回复人: fandh(好了) (2001-9-17 14:00:57) 得0分
用(unsigned char *)(LPCTSTR)即可 
回复人: ygd(ygd) (2001-9-17 16:11:17) 得0分
unsigned char *p;
CString str;
int length=str.GetLength();
for(int i=0;i<length;i++)
p[i]=str.GetAt(i);
回复人: swordbroken(断剑书生) (2001-9-17 16:25:57) 得0分
CString str;
unsigned char string[30];
strcpy(string,str);

25。何将一个unsigned int 类型变量值赋给类型为unsigned short的变量,并保证数值不丢失(当然数值在一定范围内)?
回复人: maxsuy(魔法师兔子) (2001-8-14 16:37:30) 得0分
直接=就OK了
回复人: oppmm(ppmm) (2001-8-14 16:38:11) 得0分
直接赋值
回复人: milefo(弥勒佛) (2001-8-14 16:40:40) 得0分
如果数值在一定范围内怎么回丢失呢?
unsigned short a;
unsigned int b;
a=( b & 0xffff);
你试试看吧!

26。CString ----char*
定义了char* aa的变量,现在有一个CString的变量bb,怎样把bb的值赋给aa呢?

回复人: emmai(WaTaXiWaWaTaXi) (2001-8-10 11:57:33) 得0分
aa=bb.GetBuffer();
回复人: hswqs(??????????????????) (2001-8-10 11:59:01) 得0分
aa= (LPSTR)(LPCTSTR)bb;
回复人: ydogg(灰毛兔) (2001-8-10 12:27:23) 得0分
1.aa=bb.GetBuffer(bb.GetLenth());//第一种方法
2.aa= (LPSTR)(LPCTSTR)bb; //第二种方法
回复人: zhizhi() (2001-8-10 13:16:23) 得0分
aa= (char *)(LPCTSTR)bb,hehe

27。在一个COM的接口函数中有一个 BSTR* 类型的参数,需要把一个 char * 类型转换为 BSTR* 类型,不知道如何转换? 由于调用这个函数后需要把这个参数值再取出来所以只能用指针,另外在调用的时候应该用什么类型的数据传递参数呢?大虾帮忙。

BSTR bstr = SysAllocString(L"字符串");
这样转换,用的时候你用地址操作符&啊,要不指针还得new

回复人: yongyue2000i(小吕) (2001-9-9 18:38:26) 得13分
CString str = "abcd";
BSTR bstr = str.AllocSysString();
回复人: houjzs() (2001-9-9 19:14:44) 得13分
BSTR b = SysAllocString(OLESTR("your string"));

28。要把一个double的数字输出到CEdit控件是否需要类型转换?
回复人: jiangsheng(蒋晟) (2001-8-24 14:46:17) 得0分
void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, double& value );
回复人: xiezhsh(雪中行) (2001-8-24 14:56:22) 得0分
假如你的CEdit相关的成员变量是Double型的,那根本用不着.(ClassWizard增加成员变量的对话框中,Variable Type选择Double可)
回复人: xiezhsh(雪中行) (2001-8-24 14:58:16) 得0分
假如你的CEdit相关的成员变量不是Double型的,是CString型,那就需要用ltoa()来转换成CString型,
回复人: haven(大天) (2001-8-24 14:58:32) 得0分
m_Edit.Fromat("%l",VarBouble);
updatedata(false);
回复人: 12345678() (2001-8-24 14:59:54) 得0分
CString m_Edit.Format("%lf", doubleVar);
GetDlgItem(EditID)->SetWindowText(m_strEdit);

29。该如何把 WINDOWPLACEMENT * 转换成 char **类型??

(char**)&pWP

30。怎样把CString的类型转换成char*型的?
回复人: dcz(dcz) (2001-8-19 19:13:27) 得5分
// str is CString var
char* temp = strdup(str);
...
free(temp);
回复人: yu900(疾风之狼) (2001-8-19 19:57:25) 得0分
getbuffer();即可!
回复人: aileen_long(挑战2001) (2001-8-19 21:10:35) 得0分
同意楼上的意见!
回复人: czh912() (2001-8-19 21:27:08) 得0分
char buf[20];
printf(buf,"%s",string);

回复人: casl(casl) (2001-8-19 22:59:44) 得5分
CString s("abc");
char* temp=s.GetBuffer(10);
...
s.ReleaseBuffer();
回复人: cocia(高亚) (2001-8-19 23:04:23) 得0分
char* temp=s.GetBuffer(10);
10是什么意思啊

回复人: kevin_dong(梦仙人) (2001-8-20 10:26:35) 得0分
// str is CString var
char* temp = strdup(str);
// free
free(temp);
我的这段代码在一个程序中能通过编译,但是在另外一个中总是出现cannot convert parameter 1 from 'class CString' to 'const char *'的错误。str和temp的类型都一样。这是为什么?

回复人: dcz(dcz) (2001-8-20 14:13:45) 得0分
you may setting your compiler option to UNICODE, in this case, declare the var:

// str is CString var
_TCHAR* temp = _tcsdup(str);

// free
free(str);

31。SA,SB为两个结构类型??
SA* A;
SB* B;
(SB*)A->...(调用函数)
请问此时A的类型,是指向SA还是SB
此时编译器是生成一个临时指针吗?
另外,
B=(SB*)A;此时A又是什么类型???

回复贴子:
回复人: ddeng(登登) (2001-8-9 17:13:58) 得0分
A的类型始终是SA *
B的类型始终是SB *
当进行强制类型转换时使的是临时指针
回复人: gold_water(风雨无阻) (2001-8-9 17:30:46) 得0分
同意楼上的。

32。char buff[100],char UserName[50][100],怎么将buff的值传给UserName,是其成为UserName数组中的某一项呢??

//0=<i<50
strcpy(UserName[i],buff);
回复人: Ashura(阿修罗) (2001-7-26 10:08:20) 得0分
呵呵,benbensan抢先一步。
回复人: tuita(斗牛士) (2001-7-26 10:13:22) 得0分
for (i=0;i<100;i++)
*(*(username+x)+i)=*(buffer+i)
其中0《X〈50
benbensan写的也对

回复人: kekeke(我是来向大家学习的) (2001-7-26 10:24:22) 得0分
那反过来呢?把UserName中的某一项读出赋值给buff呢?怎么弄?
回复人: benbensan(笨笨三) (2001-7-26 10:26:53) 得0分
//0=<i<50
strcpy(UserName[i],buff);
回复人: benbensan(笨笨三) (2001-7-26 10:28:15) 得0分
对不起,能错了,不过建议你看一下C语言了的指针和数组
//0=<i<50
strcpy(buff,UserName[i]);

回复人: jfzsl(剿匪总司令) (2001-7-26 10:32:57) 得0分
好好看看老潭的书先!OK?
回复人: kekeke(我是来向大家学习的) (2001-7-26 10:44:25) 得0分
好。。。。!

33。请问怎样把SYSTEMTIME类型转换成time_t类型?
SYSTEMTIME st;
GetLocalTime(&st);
CTime tm(st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
time_t t = tm.GetTime();

34。unsigned char Exponent[10]; //e
unsigned long eBytes; //e的字节数
如何转换成DWord型! ??

用强制类型转换呀
(DWord)eBeytes;
(DWord)Exponent[i];//(0<=i<=10);

回复人: xjl1980_81(阿龙) (2001-7-26 16:47:29) 得0分
我是说把e转换成DWORD型
也就是说把Exponent中的内容转换成DWORD型

回复人: cloudshadow1(云影) (2001-7-26 17:13:30) 得0分
用强制类型转换就可以了,(DWORD的高24位自动加0)
DWORD Des[10]
for (int i=0;i<11;i++)
Des[i]=Exponent[i];
至于那个ULONG的也是用强制类型软换就可以了

35。请问怎样把time_t类型转换成SYSTEMTIME类型?
回复人: haven(大天) (2001-7-26 17:12:36) 得0分
typedef struct _SYSTEMTIME
typedef long time_t
很明显不行嘛!
回复人: facexy(FACE仔) (2001-7-26 17:17:38) 得0分
哎呀,问错了,前后对象相反了;-(
忙昏了的结果…………

另外,TO 楼上的:
转换是可以的
struct tm *tblock;
SYSTEMTIME SystemTime;
memset(&SystemTime,0,sizeof(SYSTEMTIME));
tblock=localtime(&timer);
SystemTime.wYear=tblock->tm_year+1900;
SystemTime.wMonth=tblock->tm_mon+1;
SystemTime.wDay=tblock->tm_mday;
SystemTime.wHour=tblock->tm_hour;
SystemTime.wMinute=tblock->tm_min;
SystemTime.wSecond=tblock->tm_sec;
SystemTime.wDayOfWeek=tblock->tm_wday;
return &SystemTime;
回复人: zjh73(大章鱼) (2001-7-26 20:28:28) 得0分
有两种方法:
1、用CTime类
先用time_t类型构造一个CTime对象,再定义一个SYSTEMTIME结构,最后用CTime类的成员函数GetAsSystemTime将时间转换到SYSTEMTIME结构中
即可。
2、用gmtime函数
gmtime函数将time_t时间转换到tm结构中并返回一个tm指针,再将tm结构的相对应的项赋给SYSTEMTIME相对应的项即可,不过用这种方法要注
意这两种结构在天、星期等方面的记数方法有点区别,一个一般从0开始,一个一般从1开始,赋值时要注意校正,还有要注意的是SYSTEMTIME
结构中有一项是毫秒,而time_t是以秒记数的。
回复人: zjh73(大章鱼) (2001-7-26 20:32:13) 得0分
反过来也可以用Ctime类的方法
就是先用SYSTEMTIME结构构造一个CTime对象,在用CTime类中的成员函数GetTime返回一个对应的time_t即可。 36。我现在正在学习SDK编程,遇到的问题是:
我定义了一个静态长整形变量,
static long lScore=0;
我想把窗口的标题换成长整形数值,用SetWindowText函数来实现,
由于它的第二个参数要求数据类型为 unsigned short *,但用其来实现强制转换时
总是出现编译错误:
cannot convert parameter 2 from 'unsigned short *' to 'const char *'
后来改成来LPCTSTR 来实现强制转换,没有出现编译错误,但函数总是执行不成功,
请教各位高人,这倒底是怎么回事???

回复贴子:
回复人: prog_st(st) (2001-8-4 21:20:07) 得0分
/* ITOA.C: This program converts integers of various
* sizes to strings in various radixes.
*/

#include <stdlib.h>
#include <stdio.h>

void main( void )
{
char buffer[20];
int i = 3445;
long l = -344115L;
unsigned long ul = 1234567890UL;

_itoa( i, buffer, 10 );
printf( "String of integer %d (radix 10): %s/n", i, buffer );
_itoa( i, buffer, 16 );
printf( "String of integer %d (radix 16): 0x%s/n", i, buffer );
_itoa( i, buffer, 2 );
printf( "String of integer %d (radix 2): %s/n", i, buffer );

_ltoa( l, buffer, 16 );
printf( "String of long int %ld (radix 16): 0x%s/n", l,
buffer );

_ultoa( ul, buffer, 16 );
printf( "String of unsigned long %lu (radix 16): 0x%s/n", ul,
buffer );
}


Output

String of integer 3445 (radix 10): 3445
String of integer 3445 (radix 16): 0xd75
String of integer 3445 (radix 2): 110101110101
String of long int -344115 (radix 16): 0xfffabfcd
String of unsigned long 1234567890 (radix 16): 0x499602d2


回复人: lwg7603(刑满释放人员) (2001-8-4 21:36:15) 得0分
TCHAR str[255]={_T('/0')};
_stprintf(str,_T("%d"),lScore);
SetWindowText(hwnd,str);

37。我用socket发送的的buf中间需要的是 char *类型的数据,我想将一个 struct 直接转换成 char * 发过去。
我用
struct ABCD *abcd;
char *buf;
abcd = (ABCD *)calloc(1,sizeof(ABCD));
buf = (char *)calloc(1,sizeof(ABCD));
///
给abcd 中间赋值,其中有多个char[]的值和int 的值
///
memcpy(buf,abcd,sizeof(ABCD));
//strcpy(buf,(char *)abcd);也不可以
sock(host,buf,....);
//sock(host,(char *)buf,...);也不可以
问题就是在这里,这个buf中间的值总是不对,大家知道为什么否。

回复人: wolf721() (2001-7-30 18:18:34) 得5分
你传的是个指针值,而不是数据
回复人: kiko_lee(到处瞧瞧) (2001-7-30 18:50:49) 得0分
但是用memcpy这个是将整个数据都复制过去
回复人: lz_0618(lz_0618) (2001-7-30 19:26:44) 得5分
你用的VC???改成ABCD *abcd;后编译一点问题也没有啊!
sock(host,buf,....);这不知是什么,自定义函数?

typedef struct _ABCD
{
int ID;
char Name[10];
}ABCD;

.......


ABCD *abcd;
char *buf;
abcd = (ABCD *)calloc(2,sizeof(ABCD));
buf = (char *)calloc(2,sizeof(ABCD));
///
//给abcd 中间赋值,其中有多个char[]的值和int 的值
abcd[0].ID =1;
abcd[1].ID =2;
///
memcpy(buf,abcd,2*sizeof(ABCD));
strcpy(buf,(char *)abcd);//也不可以

buf中的内容也正确!!

回复人: kiko_lee(到处瞧瞧) (2001-7-31 8:57:52) 得0分
我按照楼上的兄弟说的,做了一下,但是仍然做不下来,我用
memcpy(buf,abcd,sizeof(ABCD));
中间的abcd,不知道是不是地址的问题。
回复人: supersusheng(小苏) (2001-7-31 14:30:42) 得0分
老大,你sizeof()得出的数值事多大,看看吧。
回复人: ydogg(灰毛兔) (2001-7-31 14:41:52) 得0分
只能传递流数据,结构是传递不过去的。
回复人: IamNotMan(NorGirl) (2001-7-31 14:50:53) 得5分
我常这么用
ABCD a ;
//给a的各个域赋值(一定不能含有指针项)
char* buff = new char[sizeof(ABCD)];
memcpy(buff,&a,sizeof(ABCD));
//或者 *(ABCD*)buff = a;
.................
如果buff里的数对,说明问题不在这儿吧

回复人: zb_china(最后一座水车zb_china新浪) (2001-7-31 15:16:24) 得0分
看不明白
回复人: eggplant(拉拉) (2001-7-31 15:42:48) 得0分
最好使用memcpy(),因为struct中的值有可能包含零字节,所以strcpy()可能不对,如果传递struct,最好把struct的字节对齐改为以字节为单位。
回复人: lvfengxun(lfx) (2001-7-31 16:06:57) 得5分
直接将结构指针作为send的参数发就可以了,还用转换什么
有必要在这里讨论吗?
struct AA
{
int a;
char b[100];
};
struct AA aa;
aa.a=11;
strcpy(aa.b,"aaa");
send(hSocket,(char *)(&aa),sizeof(aa),0);
//OK
回复人: mydewang(mydewang) (2001-7-31 16:33:21) 得0分
其实这里是一个字节对齐的问题,
比如
struct AA
{
int a;
char b;
};
那么sizeof( struct AA )就不等于5了,而是8了,所以,将这个结构赋值给一个char *,里面会多出一些零...

需要解决这个问题,可以在Project->Setting->Link->Project Options里加上/Zp1

另外,可以参考一下MSDN里/Zp的编译选项.....
回复人: lz_0618(lz_0618) (2001-7-31 19:43:54) 得0分
根本不是什么字节对齐的问题,我上面的程序经过测试都好用啊,这位老兄用我的那段程序究竟是什么错误,能说清楚点吗???

我这边用socket发送结构是一点问题也没有啊,而且是在VC和Delphi编的程序间通讯,当然,这时应该注意字节对齐的问题了,在VC程序间,
只要不是故意将服务器和客户端的编译环境设的不一样,肯定是没有什么问题的,最多是多传几个Bit罢了。
回复人: kiko_lee(到处瞧瞧) (2001-8-3 11:02:51) 得0分
我发现将char * memcpy 到 char * 中间都有点问题,但是如果放到 char []中间就可以了,大家知道为什么否?
回复人: ydogg(灰毛兔) (2001-8-3 11:40:35) 得0分
memcpy不copy最后的'/0'...
回复人: wenjunlin2000(微软克星) (2001-8-3 14:32:17) 得0分
是你看错了
因为char*是以0 结尾的

回复人: mc_music(狂沙) (2001-8-3 15:07:21) 得0分
请注意我的程序:
struct ABCD *abcd;
char *buf;
abcd = (ABCD *)calloc(1,sizeof(ABCD));
//初始化abcd
buf=abcd;//指针直接符值就可以了
回复人: zhangnanonnet(WinSockZhang) (2001-8-3 16:21:03) 得0分
你试试把类型变为BYTE
回复人: kiko_lee(到处瞧瞧) (2001-8-7 9:21:08) 得0分
不管了,给分,大家都有不少的建议呢。


38。double dou=12.34;我如何可以得到char * ch="12.34";转换函数是什么?

回复人: wyzegg(蛋) (2001-7-24 21:26:04) 得50分
double dou=12.34;
char * ch;
ch=malloc(100);
sprintf(ch,"%5.2f",dou);
回复人: wyzegg(蛋) (2001-7-24 21:28:24) 得0分
或者
#include <stdlib.h>
#include <stdio.h>

void main( void )
{
int decimal, sign;
char *buffer;
int precision = 10;
double source = 3.1415926535;

buffer = _ecvt( source, precision, &decimal, &sign );
printf( "source: %2.10f buffer: '%s' decimal: %d sign: %d/n",
source, buffer, decimal, sign );
}

但是第一种常用
回复人: Matrix_w(学会一点点) (2001-7-24 21:32:43) 得30分
int decimal, sign;
double dou =12.34;
char* ch;
ch = _ecvt(dou,4,&decimal,&sign);

回复人: imhua(华弟) (2001-7-24 21:35:02) 得20分
double dou=12.34;
char *str;
gcvt(dou,5,str); //5是长度
MessageBox(str);
回复人: Matrix_w(学会一点点) (2001-7-24 21:37:58) 得0分
/* _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.'

39。 我在ADO中调用一个存储过程,存储过程有三个输入参数@useradd char(30),@username char(10),@userage char(3),现在要把char
*addr,char *name,char *age分别赋值给他们。??
我做了如下定义:
_ParameterPtr para1;
_variant_t var1,var2,var3;
==============================================================
var1.vt=VT_BSTR;
var1.bstrval=addr;/////(编译错误)
==============================================================
para1=m_pCommand->CreateParameter(L"useradd",adBSTR,adParamInput,30,var1);
m_pCommand->Parameters->Append(para1);
编译结果出现下面错误:
cannot convert from 'char *' to 'unsigned short *
不知道类型是不是选择VT_BSTR?
回复人:tar(GPS) (2001-7-12 18:49:05) 得15分
var1.bstrval应该指向宽字符的字符串,
即unicode字符串
use _bstr_t to convert it

_bstr_t var1(addr);

 回复人:happyhackwang() (2001-7-12 20:06:48) 得5分
char *要进行转换成BSTR

 回复人:WhiteWaterBlueSky(疯狂数码) (2001-7-13 9:35:15) 得10分
SDK中是这样的
1。先用MultiByteToWideChar把char* 转为wchar_t*
2。再用SysAllocString把wchar_t*转为BSTR

 回复人:tar(GPS) (2001-7-13 14:10:01) 得0分
faint,我都已经把语句写出来了
_bstr_t a(addr);
var1.vt=VT_BSTR;
var1.bstrval=(wchar_t *)a;

 回复人:xwchena(西风之神) (2001-7-13 15:57:00) 得0分
大哥,我改完之后记录集无结果返回。我的代码是这样的:
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pRecordset=m_pCommand->Execute(NULL,NULL,adCmdStoredProc);
if(!m_pRecordset->adoEOF)
{
result1=m_pRecordset->GetCollect((long)0);
if(result1.vt!=NULL)
{
result1.ChangeType(VT_BSTR);
CString strResult1=result1.bstrVal;
strcpy(resval,strResult1);
}
调试的时候看到执行完m_pCommand->Execute()后m_pRecordset就到了记录集的尾部
而如果把char*型都改成int型,结果就能返回记录集。
这是为什么啊???

 回复人:tar(GPS) (2001-7-13 19:19:51) 得0分
try adVarChar
 回复人:xwchena(西风之神) (2001-7-13 22:54:21) 得0分
还是不行,记录集没有返回结果
 回复人:seesi(不是我想骗你,是我不知道怎么才能不骗!) (2001-7-14 0:24:36)

40。如何将 BSTR pVal 赋给:unsigned char *pw;如何将:unsigned char digest[16]赋给 BSTR *pOutVal?

USES_CONVERSION;
  *pOutVal=SysAllocString(A2W((LPTSTR)digest));

unsigned char *pw = (unsigned char *)_com_util::ConvertBSTRToString(pInVal);

相关文章

  • c# 实现获取汉字十六进制Unicode编码字符串的实例

    c# 实现获取汉字十六进制Unicode编码字符串的实例

    下面小编就为大家带来一篇c# 实现获取汉字十六进制Unicode编码字符串的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 深入解析C++编程中范围解析运算符的作用及使用

    深入解析C++编程中范围解析运算符的作用及使用

    这篇文章主要介绍了C++编程中范围解析运算符的使用方法,是C++入门学习中的基础知识,需要的朋友可以参考下
    2016-01-01
  • 解析使用C++编写无错代码的方法技巧

    解析使用C++编写无错代码的方法技巧

    本篇文章是对使用C++编写无错代码的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 位运算实现十进制转换为二进制

    位运算实现十进制转换为二进制

    这篇文章主要介绍了位运算实现十进制转换为二进制的相关资料,需要的朋友可以参考下
    2015-03-03
  • C语言进制转换代码分享

    C语言进制转换代码分享

    本文给大家分享的是使用C语言实现进制转换的代码,十分的简单实用,有需要的小伙伴可以参考下。
    2015-07-07
  • C++中数组作为函数参数传入的几种方式代码示例

    C++中数组作为函数参数传入的几种方式代码示例

    数组元素和数组名都可以作为函数的参数以实现函数间数据的传递和共享,下面这篇文章主要给大家介绍了关于C++中数组作为函数参数传入的几种方式,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-06-06
  • C语言用栈和队列实现的回文检测功能示例

    C语言用栈和队列实现的回文检测功能示例

    这篇文章主要介绍了C语言用栈和队列实现的回文检测功能,结合具体实例形式分析了C语言栈和队列的定义及使用栈和队列进行回文检测的操作技巧,需要的朋友可以参考下
    2017-06-06
  • C++ Boost Pool超详细讲解

    C++ Boost Pool超详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C++ opencv利用grabCut算法实现抠图示例

    C++ opencv利用grabCut算法实现抠图示例

    这篇文章主要为大家介绍了C++ opencv利用grabCut算法实现抠图的代码示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • C语言中多样式的格式控制符的使用详解

    C语言中多样式的格式控制符的使用详解

    C语言中的格式控制符类型繁多,虽然格式字符可能就那么几个,但组合起来使得格式控制符变得多样化,这对于C语言初学者来说无疑是一种痛苦,为此我将常见的格式控制符类型及意义总结一下,希望对大家有所帮助
    2023-03-03

最新评论