(LPSTR)(LPCTSTR)str到底是哪个白痴发明的?
CString str;
然后为了传入ANSI字符串
(LPSTR)(LPCTSTR)str
最先写出这种垃圾代码的白痴到底是谁?
网上到处都是,用MFC的几乎每个人都见过乃至写过!
就算是VC6,这么写结果没有问题,难道没有一个人想过LPCTSTR多一个T的意义?难道就没有一个人看过VC6安装的时候还能选UNICODE库?精简版的VC6用太多了吧!
UNICODE环境正确写法
CString str;
CStringA strA(str);
strA.GetString();或strA.GetBuffer(0);
用API?也是装B的,这是MFC啊!
字符转换这么简单的东西,难道就没一个人写对!
shit!
[解决办法]
SF!!!!!!!!
[解决办法]
你会写就写一个
[解决办法]
C++ primer上说,使用强行转换说明设计不合理,
那么,强转两次。。。
strA.GetBuffer(0);
在网上见过两种说法,一种是传入0,一种是传入字符个数
当时看到这很晕,后来还是以msdn的例子为准
[解决办法]
连续用了两个指针转换啊。看来没有人看过CString是怎么存储的。
[解决办法]
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
[解决办法]
C++语言用不好,会很可怕
[解决办法]
淡定,淡定……
有些人写代码只是为了完成任务,只是为了糊口,他们心不在此。对他们不可以要求太苛刻……
[解决办法]
淡定,淡定……
有些人写代码只是为了完成任务,只是为了糊口,他们心不在此。对他们不可以要求太苛刻……
[解决办法]
LPCTSTR 中的T是配合微软那套国际化的方案用的,如果项目使用ANSI字符集,那么LPCTSTR 就是LPCSTR,如果是Unicode字符集,就是LPCWSTR.注意里面都有一个"C",代表 const,表示字符串的内容是不可修改的。如果要修改,必须使用GetBuffer,它返回LPTSTR,使用完之后要调用ReleaseBuffer.GetString返回的是LPCTSTR,也是不可修改的。如果要转换,就像LZ所说的,明确声明CStringA或CStringW并利用构造函数进行转换。
[解决办法]
淡定,淡定……
有些人写代码只是为了完成任务,只是为了糊口,他们心不在此。对他们不可以要求太苛刻……
[解决办法]
str.GetBuffer(0);// do something // Note: do not operate the strstr.ReleaseBuffer();
[解决办法]
enum {#define EXPORT_FUNC(x) XF_ ## x ,#include <_exports.h>#undef EXPORT_FUNC XF_MAX};
[解决办法]
路过,。。。。。。。。。
[解决办法]
啥东东啊。
[解决办法]
我用void *
哈哈
[解决办法]
虽然恶心,但用起来觉得方便,GetBuffer()也挺恶心的。
[解决办法]
差一个T不是关键,关键是还差一个C。
差一个T如果错了,会编译不过
差一个C如果错了,可以编得过,后果很严重。
[解决办法]
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
[解决办法]
LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义
UNICODE:它是用两个字节表示一个字符的方法。比如字符'A'在ASCII下面是一个字符,可'A'在UNICODE下面是两个字符,高字符用0填充,而且汉字'程'在ASCII下面是两个字节,而在UNICODE下仍旧是两个字节
。UNICODE的用处就是定长表示世界文字,据统计,用两个字节可以编码现存的所有文字而没有二义。
MBCS,它是多字节字符集,它是不定长表示世界文字的编码。MBCS表示英文字母时就和ASCII一样(这也是我们容易把MBCS和ASCII搞混的原因),但表示其他文字时就需要用多字节。
WINDOWS下面的程序设计可以支持MBCS和UNICODE两种编码的字符串,具体用那种就看你定义了MBCS宏还是UNICODE宏。MBCS宏对应的字符串指针是char*也就是LPSTR,UNICODE对应的指针是unsigned short*也就是LPWSTR,为了写程序方便微软定义了类型LPTSTR,在MBCS下他就是char*, 在UNICODE下它是unsigned char*,这样你就可以重定义一个宏进行不同字符集的转换了。
LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义:
LPSTR:32bit指针 指向一个字符串,每个字符占1字节
LPCSTR:32-bit指针 指向一个常字符串,每个字符占1字节
LPCTSTR:32-bit指针 指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义
LPTSTR:32-bit指针 每字符可能占1字节或2字节,取决于Unicode是否定义
Windows使用两种字符集ANSI和UNICODE,前者就是通常使用的单字节方式,但这种方式处理象中文这样的双字节字符不方便,容易出现半个汉字的情况。而后者是双字节方式,方便处理双字节字符。
WindowsNT的所有与字符有关的函数都提供两种方式的版本,而Windows9x只支持ANSI方式。_T一般同字常数相关,如_T("Hello"。如果你编译一个程序为ANSI方式,_T实际不起任何作用。而如果编译一个程序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。_T和_L的区别在于,_L不管你是以什么方式编译,一律UNICODE方式保存.
Windows核心编程的第一章。
L是表示字符串资源为Unicode的。
比如
wchar_t Str[] = L"Hello World!";
这个就是双子节存储字符了。
_T是一个适配的宏~
当
#ifdef _UNICODE的时候
_T就是L
没有#ifdef _UNICODE的时候
_T就是ANSI的。
比如
LPTSTR lpStr = new TCHAR[32];
TCHAR* szBuf = _T("Hello");
以上两句使得无论是在UNICODE编译条件下都是正确编译的。
而且MS推荐你使用相匹配的字符串函数。
比如处理LPTSTR或者LPCTSTR 的时候,不要用strlen ,而是要用_tcslen
否则在UNICODE的编译条件下,strlen不能处理 wchar_t*的字符串。
T是非常有意思的一个符号(TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()...),它表示使用一种中间类型,既不明确表示使用 MBCS,也不明确表示使用 UNICODE。那到底使用哪种字符集?编译的时候才决定
[解决办法]
jf。。。这是为了区分unicode和asni的。。。是vs里面的类型的定义、、、
[解决办法]
没有办法啊,看了别人解释才明白一些.
特别是做变体类型转换,非要这样用不可,否则就会出错.
[解决办法]
反正不是我写的,熟视无睹。
[解决办法]
两种都用,想用什么就用什么,软件能工作,老板按时给我发工资就行,其它的我不管
[解决办法]
我用getbuffer(0);
[解决办法]
[解决办法]
世界上一开始就是Unicode就好了,所以在这点上更偏爱Java的char。
[解决办法]
其实用utf8更不错...好多代码不用改就是对的...
[解决办法]
楼主,首先,那不是强制转换,是一个重载后的操作符。。。。。。
[解决办法]
学习中,顶下!
[解决办法]
JF.............