我的程序如下:
CListBox *plist;
CString *pName;
int i;
for(i = 0;i<=num;i++)
{
plist->GetText(i,pName);
this->MessageBox(pName,NULL,MB_OK);
}
编译后编译器说不能把class CString * 转换为 char * 当我用(char *)进行
强制转换后编译器又说pName没有被初始化。
CListBox *plist;
CString *pName;
int i;
for(i = 0;i<=num;i++)
{
plist->GetText(i,pName);
this->MessageBox(pName,NULL,MB_OK);
}
编译后编译器说不能把class CString * 转换为 char * 当我用(char *)进行
强制转换后编译器又说pName没有被初始化。
GetText(int ,LPTSTR)这个实现!
char*[] 是字符批针数组,使用前应给每一个素一个有效的地址。
const char* 是一个不能改变内容的字符指针,声明时需给出有效的地址。
CString是封装的一个可变长字符串的类。它的指针可变。遗憾的是,前两位朋友所说的方法都不正确。正确用法:
CListBox* plist;
CString sName;
char cName[nnn];/*看你的字串长度定nnn的值*/plist = /*有效的且显示在窗口上的LIST的窗口指针*/;
for (int i = 0; i <= num; i ++)
{
plist->GetText(i, cName);
sName = cName;
MessageBox(sName, NULL);
}或
CListBox *plist;
CString pName;plist = valide list control which has been created;
for (int i = 0; i <= num; i ++)
{
pName.Empty;
plist->GetText(i, pName.GetBufferSetLength(nnn));
MessageBox(pName, NULL);
}
--------------------------------------------------
TV_INSERTSTRUCT tvinsert;
CString sDrive = "C:\\";
tvinsert.item.pszText = sDrive; //rise error
----------------------------------------------
此时。由于pszText 是 char * 我就做了如下转换
tvinsert.item.pszText = (LPTSTR) &sDrive;
编译正确。可是这个TREEVIEW该节点的TEXT不是C:\而是一些乱七八糟的字符
于是我又改变了一下转换
tvinsert.item.pszText = (LPTSTR &)sDrive;
编译便正确了。显示的字符也正确
我要闻的问题是
这是为什么,他们的区别是什么
再次谢谢给位?
char* 是字符串指针,使用前需给它一个有效的地址。
char*[] 是字符批针数组,使用前应给每一个素一个有效的地址。
const char* 是一个不能改变内容的字符指针,声明时需给出有效的地址。
CString是封装的一个可变长字符串的类。它的指针可变。
yarao,从你新的问题看出,你还是没有弄明白他们的关系
感觉你没有用过C一样,是不是被VB毒害的?
其实在C里没有真正的字符串。
所谓的字符串是一个由\0结尾的char型的一维数组
一般的文档会叫它为null-terminated string
加了const,表示它的内容不能再被修改
等于是你告诉编译器,“这个变量的值不能改哦,谁改了你就告发它,然后罢工”
当你觉得某个变量不应该被修改时
加const是个好习惯,因为你可以在编译的时候就得到错误
关于CString
CString是个类,它通过重载操作符使得字符串。
不懂重载操作符?
去温习一下C++
(谁打我?)
(台下的人:“你牛什么啊牛”)
哎呀,其实我也是为你好,要明白错误,必须要搞明白问题的关键
比如CString重载了操作符“=”
你用
CString sOne="你要做什么?";
其实等于
char cOne[256];
strcpy(cOne,"你要做什么?");
绝对不等于
char cOne[256];
cOne="你要做什么?"而且CString会自动的管理内存分配
你就不用去担心会不会溢出了ok,回到你上面的问题TV_INSERTSTRUCT tvinsert;
CString sDrive = "C:\\";
tvinsert.item.pszText = sDrive; //rise error 为什么错呢?
因为tvinsert.item.pszText的类型是LPTSTR
也就等于是char *
而CString只有一个
operator LPCTSTR ( ) const
不懂“operator LPCTSTR ( ) const”什么意思?
再去温习一下C++
(哇靠,还好我躲的快。 下次不要用西红柿好不好?)
所以编译器不会自动的转换。
那么为什么
tvinsert.item.pszText = (LPTSTR) &sDrive;
也不对呢?
因为&sDrive,你是取到了sDrive这个CString对象的地址
然后你又把这个地址强行转换为LPTSTR,那怎么会对呢
再看看
tvinsert.item.pszText = (LPTSTR &)sDrive;
其实也是歪打正着
我没有明白为什么编译正确还可以正确?
正确的用法应该是
tvinsert.item.pszText = (LPTSTR)(LPCTSTR)sDrive;
我的问题现在已经解决。但是我的心里却充满了更多的疑惑。
A:
CString 是一个指向字符串的指针吗?
B:
CListBox::GetText(int ,LPTSTR)中 evelan说我只要把CString * pName 换位
CString strName 调用该函数即可。是不是 CString 就是与 LPTSTR等价呢?
C:
tvinsert.item.pszText的类型是LPTSTR为什么我不能用
CString sDrive;
tvinsert.item.pszText = sDrive;
D:
LPTSTR,LPCTSTR,CString 它们之间到底存在什么样的转换关系。在msdn上说我们可以通过GetBuffer()成员函数把CString用为LPTSTR。而为什么不能用(LPTSTR)进行类型转换了。
我决定将分数加高!希望Kenny和royluo及各位网友不吝赐教
谢谢
yarao 2000.5.27
A:
CString 是一个类
你使用
CString sMyName;
那么sMyName就是一个CString的对象
它与字符串的指针无关,只不过类CString是一个处理字符串的类
B:
不等价
那样理解也是绝对错误的。
你只所以可以那样做
不是因为
CListBox有一个
int GetText( int nIndex, LPTSTR lpszBuffer ) const;
是因为它同时还有一个
void GetText( int nIndex, CString& rString ) const;
你看看MSDN的关于CListBox::Gettext的Help就知道了
系统是使用的
void GetText( int nIndex, CString& rString ) const;
C:
很气愤,我想暴打你一顿,然后烤来吃
因为我前面已经说过了
tvinsert.item.pszText的类型是LPTSTR
而CString只有LPCTSTR的转换函数
所以编译器不会自动的转换。
D:
LPTSTR == char* 是字符串“指针”,使用前需给它一个有效的地址。
LPCTSTR == const char* 是一个不能改变内容的字符“指针”,声明时需给出有效的地址。
CString是封装的一个可变长字符串的“类”。
LPTSTR可以自动转换为LPCTSTR
LPCTSTR只能强制转换为LPTSTR
CString只所以和他们有千丝万缕的关系
是因为CString有支持LPTSTR和LPCTSTR的构建函数、赋值符重载等等
再说就说到C++是怎么回事了。
我的建议是:你还需要学习C/C++,不是温习。
然后再看看CString的头文件,你都知道为什么它那么神奇了。
反正我也是过过侃瘾,哈哈
希望对你有所帮助就好
如果你要用臭鸡蛋砸我,通知一下
我换衣服先,我现在可是穿的新衣服
不过我感觉你的根本原因还是C/C++的基础不牢
才出这样的问题
我以前学C++是看的一本台湾的专门讲C++的书
好象当时还是用的Borland C++ 3.1
具体书名忘了。