CString str;
m_Inf.GetWindowText(str);
str=str.Right(1);
send(s,p,sizeof(char),0);//此处p是char *类型,
如何把CString str 转化为char * 类型呢。
m_Inf.GetWindowText(str);
str=str.Right(1);
send(s,p,sizeof(char),0);//此处p是char *类型,
如何把CString str 转化为char * 类型呢。
解决方案 »
- 急!在VC下可以改变控件的字体,为什么在EVC下不能改变?
- 对话框以及按钮反应问题,请各位打侠支招~~
- boundschecker 6.5与VC6.0集成问题
- 如何知道用户已多少时间没有操作电脑了?
- 我的程序在InitInstance中启动了其它程序,如何使我的程序在启动完成后在最上面,并有焦点?
- 我在 Cmainframe 用一个对话框工具条CDialogBar 上面添加拉控件ID 号为IDC_CHECK 的 checkbox 我如何在 程序中得到 CDialogBar 上复选
- 问一个白痴问题:什么叫makefile?
- 每周下载-<VC实效编程百例>配书源码
- 学习串口通信系列问题(一)
- 高手们:IE浏览器的刷新问题?
- IRichEditOle::GetObject 是怎么个用法
- 为什么有时候在classview中添加成员函数或者变量之后该类会消失?
send(s,sz,sizeof(char),0);我这样写,还是 不行呀!error C2440: 'initializing' : cannot convert from 'unsigned short *' to 'char *'
GetBuffer是返回一个锁定的内存地址,参数是指要锁定的内存长度好好看看msdn
send(s,sz,strlen(sz),0);这样就行了
char* sz = str.GetBuffer(str.GetLength());
报错:
E:\WinsockClient\WinsockClientDlg.cpp(182) : error C2440: 'initializing' : cannot convert from 'unsigned short *' to 'char *'
CString str;
int nLength=str.GetLength();
char * sz=new char[nLength];
sz=str.GetBuffer(0);
{
CString str;
char CR[1]={13};
char c[1];
m_Inf.GetWindowText(str);
str=str.Right(1);
int nLength=str.GetLength();
char * sz=new char[nLength];
sz=str.GetBuffer(0); ///此处报错!
send(s,sz,sizeof(char),0);}
E:\WinsockClient\WinsockClientDlg.cpp(178) : error C2440: '=' : cannot convert from 'unsigned short *' to 'char *'
LPWSTR p = s.GetBuffer( 10 );
wcscpy( p, L"Hello" ); // directly access CHString buffer
s.ReleaseBuffer( );
printf("CHString s %S", (LPCWSTR)s);
int nLength=str.GetLength();
char * sz=new char[nLength];//new出来干什么?
send(s,sz,sizeof(char),0);//sizeof(char)? 你又想干什么?不明白你想干什么,你试试我改后的
CString str;
m_Inf.GetWindowText(str);
char* sz=(char*)str.GetBuffer(str.GetLength());
send(s,sz,strlen(sz),0);
只是不解其意思!我的意思是这样的,
我在EVC4.0(嵌入式VC4.0,语法和VC6相似。)平台上做一个winsock通信的客户端,
用户在文本框每键入一个字符,就调用send()发送至服务器端进行处理。
而EVC的字符处理都是unicode编码方式,send()函数,发送数据的类型是char 型的。
就是这么个转换问题了!
1.若str加长字符串的长度,会引起缓冲溢出,导致系统崩溃;
2.CString有写引用机制(即多个CString初始公用一个内存,改写时再重新分配内存),而str改写CString时系统不会意识到要重新分配内存,所以你可能同时也会改变其他的变量!
最规范的用法是:GetBuffer()。
vc为CString提供GetBuffer自有它的道理,如果你想成为合格的程序员,就应该多花时间了解一些内部的机制,这也是那帮老外提倡的。
CString str;
m_Inf.GetWindowText(str);
USES_CONVERSION;
LPSTR lpText = W2A(str);
send(s,lpText,strlen(lpText),0);
unsigned char * a = (unsigned char *)(LPCSTR)str;
std::string strTemp=(LPCTSTR)CString(str);
const char*p=strTemp.c_str();
WideCharToMultiByte(CP_ACP,0,str.GetBuffer(),-1,(LPSTR)szText,MAX_PATH,NULL,NULL);
感觉是很麻烦。但好像没有别的办法了!
send(socket,Str.GetBuffer(0),Str.GetLength(),0);
CStringA s2(s1);
char cData[MAX_PATH] = 0;
strcpy_s(cData,sizeof(char)*MAX_PATH,s2);//或者s2.GetBuffer();之后直接s2.ReleseBufer();
//这样写也可以
CString s1(_T("Hello World"));
strcpy_s(cData,sizeof(char)*MAX_PATH,CStringA(s2))//我经常这么用..没出过什么事.CString==CStringT Unicode下CStringT == CStringW 多字节下CStringT == CStringA msdn上面好像有这么转的...我忘了看到过一次.
CString strMsg;strMsg= ( CString ) "测试";
strcpy( str,strMsg);
看来只好使用这样的办法了,拒绝使用CString!使用最原始的TCHAR*!