转自:http://blog.csdn.net/txdb/article/details/7298502
vc中的字符串类型真是眼花缭乱。
下面来google下。
整理如下:
c中只有字符数组,字符数组如果以\0结尾,就是字符串
c++中有字符串类型string,string接收字符数组,string要通过方法c_str()转换才能赋值给字符数组。
这个世界本来挺简单的。
Cstring 只有mfc中才有。对mfc不喜欢,直接略过。总觉得mfc把简单的问题搞复杂。
LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义:
LPSTR:32bit指针 指向一个字符串,每个字符占1字节
LPCSTR:32-bit指针 指向一个常字符串,每个字符占1字节
LPCTSTR:32-bit指针 指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义
LPTSTR:32-bit指针 每字符可能占1字节或2字节,取决于Unicode是否定义
这些操作的都是指向字符数组。
经常看到_T,
T是非常有意思的一个符号(TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()...),它表示使用一种中间类型,既不明确表示使用 MBCS,也不明确表示使用 UNICODE。那到底使用哪种字符集?编译的时候才决定.
unicode下_T就相当于_L
简单说加T就是不确定是1个字节还是2个字节。根据环境定。
LPSTR相当于char*。
WCHAR是2个字节的。根据定义WCHAR 和wchar_t是一样的。
c太老了。所以一个字符串就有这么多的门道。
而win32 的api函数用的LPSTR等,实际上操作的都是char*。或者WCHAR*。一般都是定义2个函数,用宏来自动适应。
这些指针的定义可能是win32下独有的。函数间传递还是用string好。或者是wstring。好像basic_string 是支持T宏的。
不过string毕竟还只是一个指针,只有char数组才是真货。
下面搞个小例子,把edit中的内容在messagebox中显示出来。
TCHAR usrname[100],usrpass[100];
GetDlgItemText(hDlg,IDC_EDIT_usrname,usrname,100);
::MessageBox(hDlg,usrname,(LPCWSTR)L"tips",MB_YESNOCANCEL);
一切其他类型都是浮云,各种其他类型接收TCHAR都是友好的(我想)。
然后要转换成string就是
std::basic_string<TCHAR> susrname,susrpass;
susrname=usrname;
susrpass=usrpass;
当然char不是不能接收中文的。。
关于string参数 ,还得说明下。最常见的string参数的写法是
doLogin(const std::string& usrname,const std::string& usrpass)
加了&,则传递的是地址,省去了copy。但是为了避免dologin中不小心对usrname的改动,影响函数外部。所以加个const,表示不能修改。const在编译的时候起作用。
让你编译通不过。
总得来说就是win32 api 要的是char,wchar,tchar。