关于VC++的字符串
VC转换格式
CString ,BSTR ,LPCTSTR之间关系和区别CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针。
CString 是一个完全独立的类,动态的TCHAR数组,封装了 + 等操作符和字符串操作方法。
typedef OLECHAR FAR* BSTR;typedef const char * LPCTSTR;vc++中各种字符串的表示法首先char* 是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。
LP的含义是长指针(long pointer)。
LPSTR是一个指向以‘\0’结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。
而LPCSTR中增加的‘C’的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。
1.LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别的,都是32位.所以这里的LP和P是等价的.2.C表示const3.T是什么东西呢,我们知道TCHAR在采用Unicode方式编译时是wchar_t,在普通时编译成char.为了满足程序代码国际化的需要,业界推出了Unicode标准,它提供了一种简单和一致的表达字符串的方法,所有字符中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法。
LPWSTR与LPCWSTR由此产生,它们的含义类似于LPSTR与LPCSTR,只是字符数据是16位的wchar_t而不是char。
然后为了实现两种编码的通用,提出了TCHAR的定义:如果定义_UNICODE,声明如下:typedef wchar_t TCHAR;如果没有定义_UNICODE,则声明如下:typedef char TCHAR;LPTSTR和LPCTSTR中的含义就是每个字符是这样的TCHAR。
C语言--字符串详解
C语⾔--字符串详解 字符串是⼀种⾮常重要的数据类型,但是C语⾔不存在显式的字符串类型,C语⾔中的字符串都以字符串常量的形式出现或存储在字符数组中。
同时,C 语⾔提供了⼀系列库函数来对操作字符串,这些库函数都包含在头⽂件 string.h 中。
⼀、字符串常量和字符数组1.1、什么是字符串常量 C 语⾔虽然没有字符串类型,但是 C语⾔提是存在字符串这个概念的,也就是字符串常量:以 NUL 字节结尾的 0 个或多个字符组成的序列。
字符串常量是不可被修改的,⼀般⽤⼀对双引号(" ")括起的⼀串字符来表⽰字符串常量,如: "Hello!"、"\aWarning!\a"、"123abc\n"、"" 字符串常量可以为空,如""就是⼀个空的字符串常量,但是即使为空,还是存在⼀个终⽌符 NUL 的。
(在 C 语⾔中,常⽤转义字符 \0来表⽰ NUL)1.2、字符串常量与指针 字符串常量与指针关系密切,因为字符串常量的值,实际上表⽰的是存储这些字符的内存空间的地址,更准确地说是字符串常量中第 1个字符的地址,⽽不是这些字符本⾝。
因此,在 C 语⾔中是不能直接进⾏字符串赋值的(因为没有字符串类型嘛)。
在 C 语⾔中,常通过声明⼀个指向 char 类型的指针并将其初始化为⼀个字符串常量的⽅式来访问⼀个字符串:char *message = "Hello World!";// 上⾯的语句也可以拆分成下⾯两句char *message;message = "Hello World!"; // 这句话看起来像是字符串复制,其实不是,只是涉及到指针操作 上述语句声明了⼀个指向 char 类型的指针,并⽤字符串常量中第 1 个字符的地址对该指针进⾏初始化。
可以通过字符指针 message 来访问字符串常量:#include <stdio.h>int main(){ char *message = "Hello World!"; printf("%s\n",message); while(*message != '\0'){ printf("%c ",*message++); } printf("\n"); return0;}/* output:* Hello World!* H e l l o W o r l d !*/ 这段代码,使⽤字符指针遍历了字符串常量中的每⼀个字符。
c语言字符串数组定义的几种方式
C语言中,字符串数组是一个很常见的数据类型。
在定义字符串数组的过程中,有几种方式可以使用,每种方式都有其特点和适用场景。
接下来,我将从浅入深地介绍这几种方式,并对其进行全面评估。
1. 使用字符数组来定义字符串数组在C语言中,可以使用字符数组来定义字符串数组。
例如:```char strArray[3][20] = {"hello", "world", "c语言"};```这种方式是最基础的定义字符串数组的方法。
它的优点是简单直接,容易理解和使用,适用于简单的场景。
但缺点是不够灵活,每个字符串的长度都是固定的,不能动态调整。
2. 使用指针数组来定义字符串数组除了使用字符数组,还可以使用指针数组来定义字符串数组。
例如:```char *strArray[3] = {"hello", "world", "c语言"};```这种方式相比于字符数组更加灵活,每个字符串的长度可以动态调整。
但要注意的是,需要手动管理每个字符串的内存空间,避免出现内存泄漏等问题。
3. 动态分配内存来定义字符串数组另一种方式是动态分配内存来定义字符串数组。
这种方式可以在运行时动态申请和释放内存,非常灵活。
例如:```char **strArray;strArray = (char **)malloc(3 * sizeof(char *));for (int i = 0; i < 3; i++) {strArray[i] = (char *)malloc(20 * sizeof(char));}strcpy(strArray[0], "hello");strcpy(strArray[1], "world");strcpy(strArray[2], "c语言");```这种方式虽然灵活,但需要手动管理内存,容易出现内存泄漏和指针错误等问题,需要谨慎使用。
VC常用数据类型总结
VC 常用数据类型总结1.ATOM 原子(原子表中的一个字符串的参考)2.BOOL 布尔变量3.BOOLEAN 布尔变量4.BYTE 字节(8位)HAR Windows字符6.CHAR Windows字符7.COLORREF 红、绿、蓝(RGB)彩色值(32位)8.Const 变量,该变量的值在执行期间保持为常量9.CRITICAL_SECTION 临界段对象10.CTRYID 国名标识符11.DLGPROC 指向一个对话框过程的指针12.DWORD 双字(32位)13.ENHMFENUMPROC 指向一个应用程序定义的回调函数的指针,该回调函数枚举增强的元文件记录14.ENUMRESLANGPROC 指向一个应用程序定义的回调函数的指针,该回调函数枚举资源语言。
15.ENUMRESNAMEPROC 指向一个应用程序定义的回调函数的指针,该回调函数枚举资源名称。
16.ENUMRESTYPEPROC 指向一个应用程序定义的回调函数的指针,该回调函数枚举资源类型。
17.FARPROC 指向一个回调函数的指针18.FLOAT 浮点变量19.FMORDER 32位字体映射值的数组20.FONTENUMPROC 指向一个应用程序定义的回调函数的指针,该回调函数枚举字体21.GOBJENUMPROC 指向一个应用程序定义的回调函数的指针,该回调函数枚举图形设备接口(GDI)对象22.HACCEL 加速键表句柄23.HANDLE 对象的句柄24.HBITMAP 位图句柄25.HBRUSH 画刷句柄26.HCONV 动态数据交换(DDE)会话句柄27.HCONVLIST DDE 会话句柄28.HCURSOR 光标句柄29.HDC 设备描述表(DC)句柄30.HDDEDATA DDE 数据句柄31.HDLG 对话框句柄32.HDWP 延期窗口位置结构句柄33.HENHMETAFILE 增强原文件句柄34.HFILE 文件句柄35.HFONT 字体句柄36.HGDIOBJ GDI 对象句柄37.HGLOBAL 全局内存块句柄38.HHOOK 钩子句柄39.HICON 图标句柄40.HINSTANCE 实例句柄41.HKEY 登记关键字句柄42.HLOCAL 局部内存块句柄43.HMEMU 菜单句柄44.HMETAFILE 元文件句柄45.HMIDIIN 乐器的数字化接口(MIDI)输入文件句柄46.HMIDIOUT MIDI 输出文件句柄47.HMMIO 文件句柄48.HOOKPROC 指向一个应用程序定义的钩子函数的指针49.HPALETTE 调色板句柄50.HPEN 画笔句柄51.HRGN 域句柄52.HRSRC 资源句柄53.HSZ DDE 字符串句柄54.HWAVEIN 波形输入文件句柄55.HWAVEOUT 波形输出文件句柄56.HWINSTA 工作站句柄57.HWND 窗口句柄58.INT 符号整数NGID 语言标识符60.LCID 所在国(Locale)标识符61.LCTYPE 所在国类型62.LINEDDAPROC 指向一个回调函数的指针,该回调函数处理行坐标63.LONG 32位符号整数64.LP 指向一个以"NULL"结束的Unicode(TM)字符串的指针65.LPARAM 32位消息参数66.LPBOOL 指向一个布尔变量的指针67.LPBYTE 指向一个字节的指针68.LPCCH 指向一个Windows字符常量的指针69.LPCCHOOKPROC 指向一个应用程序定义的钩子函数的指针70.LPCFHOOLPROC 指向一个应用程序定义的钩子函数的指针71.LPCH 指向一个Windows字符的指针72.LPCOLORREF 指向一个COLORREF值的指针73.LPCRITICAL_SECTION 指向一个临界段对象的指针74.LPCSTR 指向一个以"NULL"结束的WINDOWS字符串常量的指针75.LPCTSTR 指向一个以"NULL"结束的Unicode或Windows字符串常量的指针76.LPCWCH 指向一个以"NULL"指向一个以"NULL"结束的Unicode字符常量的指针77.LPCWSTR 指向一个以"NULL"指向一个以"NULL"结束的Unicode字符串常量的指针78.LPDWORD 指向一个无符号双字(32位)的指针79.LPFRHOOLPROC 指向一个应用程序定义的钩子函数的指针80.LPHANDLE 指向一个句柄的指针81.LOHANDLER_FUNCTION 指向一个处理程序函数的指针82.LPHWAVEIN 指向一个波形输入文件句柄的指针83.LPHWAVEOUT 指向一个波形输出文件句柄的指针84.LPINT 指向一个符号整数的指针85.LPLONG 指向一个符号长整数(32位)的指针86.LPOFNHOOKPROC 指向一个应用程序定义的钩子函数的指针87.LPPRINTHOOKPROC 指向一个应用程序定义的钩子函数的指针88.LPSETUPHOOKPROC 指向一个应用程序定义的钩子函数的指针89.LPTSTR 指向一个以NULL结束的Unicode或Windows字符串的指针90.LRESULT 消息处理的符号结果91.LPVOID 指向任何类型的指针92.LPWSTR 指向一个以"NULL"结束的Unicode字符串的指针93.LUID 局部唯一的标识符94.MCIDEVICEID 媒体控制接口(MCI)设备标识符95.MFENUMPROC 指向一个应用程序定义的回调函数的指针,该回调函数枚举元文件记录96.MMRESULT 多媒体消息的处理结果97.NPSTR 指向一个以"NULL"结束的Windows字符串的指针98.NWPSTR 指向一个以"NULL"结束的Unicode字符串的指针99.PBOOL 指向一个布尔变量的指针100.PBYTE 指向一个字节的指针101.PCCH 指向一个Windows字符常量的指针102.PCH 指向一个Windows字符的指针103.PCHAR 指向一个Windows字符的指针104.PCRITICAL_SECTION 指向一个临界段对象的指针105.PCSTR 指向一个以"NULL"结束的Windows字符串常量的指针106.PCWCH 指向一个Unicode字符常量的指针107.PCWSTR 指向一个以"NULL"结束的Unicode字符串常量的指针108.PDWORD 指向一个无符号双字的指针109.PFLOAT 指向一个浮点变量的指针110.PFNCALLBACK 指向一个回调函数的指针111.PHANDLE 指向一个句柄的指针112.PHANDLER_ROUTINE 指向一个处理程序的指针113.PHKEY 指向一个登记关键字的指针114.PINT 指向一个符号整数的指针115.PLONG 指向一个符号长整数的指针116.PLUID 指向一个局部唯一的表示符(LUID)的指针117.PROPENUMPROC 指向一个应用程序定义的回调函数的指针,该回调函数枚举窗口特征118.PSHORT 指向一个符号短整数的指针119.PSID 指向一个加密标识符(SID)的指针120.PSTR 指向一个以"NULL"结束的Windows字符串的指针121.PSZ 指向一个以"NULL"结束的Windows字符串的指针122.PTCH 指向一个Windows或Unicode字符的指针123.PTCHAR 指向一个Windows或Unicode字符的指针124.PTSTR 指向一个以"NULL"结束的Windows或Unicode字符串的指针125.PUCHAR 指向一个无符号Windows字符的指针126.PUINT 指向一个无符号整数的指针127.PULONG 指向一个无符号长整数的指针128.PUSHORT 指向一个无符号短整数的指针129.PVOID 指向任何类型的指针130.PWCH 指向一个Unicode字符的指针131.PWCHAR 指向一个Unicode字符的指针132.PWORD 指向一个无符号字的指针133.PWSTR 指向一个以"NULL"结束的Unicode字符串的指针134.REGSAM 登记关键字的加密掩码135.SC_HANDLE 服务句柄136.SERVICE_STATUS_HANDLE 服务状态值句柄137.SHORT 短整数138.SPHANDLE 指向一个句柄的指针139.TCHAR Unicode或Windows字符140.TIMERPROC 指向一个应用程序定义的定时器回调函数的指针141.UCHAR 无符号Windows字符142.UINT 无符号整数143.ULONG 无符号长整数HORT 无符号短整数145.VOID 任何类型146.WCHAR Unicode字符147.WNDENUMPROC 指向一个应用程序定义的回调函数的指针,该回调函数枚举窗口148.WNDPROC 指向一个应用程序定义的窗口过程的指针149.WORD 无符号字(16位)150.WPARAM 32位消息参数151.YIELDPROC 指向一个输出回调函数的指针。
VC使用说明书
VC使用说明我们所需要建立的程序的主要功能是自动生成零件加工工艺规程,内容主要是画边框,,画零件图,固定文本输出,从数据库输出信息。
一:建立新的应用程序:在project name 里面写上你所要建的程序名称,选择保存路径,选择Create new workspace。
点击下一步,在第一步中选择建立单文档应用程序即SDI。
其他步选择默认,第六步选择Finish。
此时会显示所建立的应用程序的基本信息。
这时的程序是一个空框架,MFC提供了四个类,APP类,View类,Doc类,还有MainFrame类。
二:创建画笔,画刷,画边框:1:创建画笔,创建画笔的函数声明如下:CPen( int nPenStyle, int nWidth, COLORREF crColor );第一个参数nPenStyle 指定画笔的类型,比如PS_SOLID指实线画笔,PS_DASHDOT代表虚线画笔等等。
这里可以从MSDN 中找到所需要的参数。
第二个参数nWidth指定画笔的宽度,第三个指定画笔的颜色,画笔颜色设置采用RGB模式,R代表红色,G代表绿色,B代表蓝色,每一种分量从0~255变化,一般形式为RGB(r,g,b),R,G,B全部为0代表白色,全部为255为黑色。
另一种创建画笔的声明为:CPen( int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL );前三个参数同上,第四个参数pLogBrush是指向LOGBRUSH结构体的指针。
nStyleCount指定长度,如果nPenStyle不是PS_USERSTYLE,则其必须为0。
lpStyle为指向一串双字组数值的指针,如果nPenStyle不是PS_USERSTYLE,lpStyle须是NULL。
详细信息请参看MSDN。
VC++标准C++中的string类的用法总结
VC++标准C++中的string类的⽤法总结相信使⽤过MFC编程的朋友对CString这个类的印象应该⾮常深刻吧?的确,MFC中的CString类使⽤起来真的⾮常的⽅便好⽤。
但是如果离开了MFC框架,还有没有这样使⽤起来⾮常⽅便的类呢?答案是肯定的。
也许有⼈会说,即使不⽤MFC框架,也可以想办法使⽤MFC中的API,具体的操作⽅法在本⽂最后给出操作⽅法。
其实,可能很多⼈很可能会忽略掉标准C++中string类的使⽤。
标准C++中提供的string类得功能也是⾮常强⼤的,⼀般都能满⾜我们开发项⽬时使⽤。
现将具体⽤法的⼀部分罗列如下,只起⼀个抛砖引⽟的作⽤吧,好了,废话少说,直接进⼊正题吧!要想使⽤标准C++中string类,必须要包含#include <string>// 注意是<string>,不是<string.h>,带.h的是C语⾔中的头⽂件using std::string;using std::wstring;或using namespace std;下⾯你就可以使⽤string/wstring了,它们两分别对应着char和wchar_t。
string和wstring的⽤法是⼀样的,以下只⽤string作介绍:string类的构造函数:string(const char *s);//⽤c字符串s初始化<BR>string(int n,char c);//⽤n个字符c初始化此外,string类还⽀持默认构造函数和复制构造函数,如string s1;string s2="hello";都是正确的写法。
当构造的string太长⽽⽆法表达时会抛出length_error异常;string类的字符操作:const char &operator[](int n)const;const char &at(int n)const;char &operator[](int n);char &at(int n);//operator[]和at()均返回当前字符串中第n个字符的位置,但at函数提供范围检查,当越界时会抛出out_of_range异常,下标运算符[]不提供检查访问。
VC中实现GB2312、BIG5、Unicode编码转换的方法
VC中实现GB2312、BIG5、Unicode编码转换的⽅法本⽂主要以实例形式讨论了VC编译环境下,实现字符串和⽂件编码⽅式转换的⽅法,在linux下请使⽤Strconv来实现。
具体⽅法如下:⼀、⽂件编码格式转换//GB2312 编码⽂件转换成 Unicode:if((file_handle = fopen(filenam,"rb")) != NULL){//从GB2312源⽂件以⼆进制的⽅式读取buffernumread = fread(str_buf_pool,sizeof(char),POOL_BUFF_SIZE,file_handle);fclose(file_handle);//GB2312⽂件buffer转换成UNICODEnLen =MultiByteToWideChar(CP_ACP,0,str_buf_pool,-1,NULL,0);MultiByteToWideChar(CP_ACP,0,str_buf_pool,-1,(LPWSTR)str_unicode_buf_pool,nLen);//组装UNICODE Little Endian编码⽂件⽂件头标⽰符"0xFF 0xFE"//备注:UNICODE Big Endian编码⽂件⽂件头标⽰符"0xFF 0xFE"//Little Endian与Big Endian编码差异此处不详述unicode_little_file_header[0]=0xFF;unicode_little_file_header[1]=0xFE;//存储⽬标⽂件if((file_handle=fopen(filenewname,"wb+")) != NULL){fwrite(unicode_little_file_header,sizeof(char),2,file_handle);numwrite = fwrite(str_unicode_buf_pool,sizeof(LPWSTR),nLen,file_handle);fclose(file_handle);}}⼆、字符串编码格式转换//GB2312 转换成 Unicode:wchar_t* GB2312ToUnicode(const char* szGBString){UINT nCodePage = 936; //GB2312int nLength=MultiByteToWideChar(nCodePage,0,szGBString,-1,NULL,0);wchar_t* pBuffer = new wchar_t[nLength+1];MultiByteToWideChar(nCodePage,0,szGBString,-1,pBuffer,nLength);pBuffer[nLength]=0;return pBuffer;}//BIG5 转换成 Unicode:wchar_t* BIG5ToUnicode(const char* szBIG5String){UINT nCodePage = 950; //BIG5int nLength=MultiByteToWideChar(nCodePage,0,szBIG5String,-1,NULL,0);wchar_t* pBuffer = new wchar_t[nLength+1];MultiByteToWideChar(nCodePage,0,szBIG5String,-1,pBuffer,nLength);pBuffer[nLength]=0;return pBuffer;}//Unicode 转换成 GB2312:char* UnicodeToGB2312(const wchar_t* szUnicodeString){UINT nCodePage = 936; //GB2312int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL);char* pBuffer=new char[nLength+1];WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL);pBuffer[nLength]=0;return pBuffer;}//Unicode 转换成 BIG5:char* UnicodeToBIG5(const wchar_t* szUnicodeString){UINT nCodePage = 950; //BIG5int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL);char* pBuffer=new char[nLength+1];WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL);pBuffer[nLength]=0;return pBuffer;}//繁体中⽂BIG5 转换成简体中⽂ GB2312char* BIG5ToGB2312(const char* szBIG5String){LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);wchar_t* szUnicodeBuff = BIG5ToUnicode(szBIG5String);char* szGB2312Buff = UnicodeToGB2312(szUnicodeBuff);int nLength = LCMapString(lcid,LCMAP_SIMPLIFIED_CHINESE, szGB2312Buff,-1,NULL,0);char* pBuffer = new char[nLength + 1];LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE,szGB2312Buff,-1,pBuffer,nLength);pBuffer[nLength] = 0;delete[] szUnicodeBuff;delete[] szGB2312Buff;return pBuffer;}//简体中⽂ GB2312 转换成繁体中⽂BIG5char* GB2312ToBIG5(const char* szGBString){LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);int nLength = LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,NULL,0);char* pBuffer=new char[nLength+1];LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,pBuffer,nLength);pBuffer[nLength]=0;wchar_t* pUnicodeBuff = GB2312ToUnicode(pBuffer);char* pBIG5Buff = UnicodeToBIG5(pUnicodeBuff);delete[] pBuffer;delete[] pUnicodeBuff;return pBIG5Buff;}三、API 函数:MultiByteToWideChar参数说明第⼀个参数为代码页, ⽤ GetLocaleInfo 函数获取当前系统的代码页,936: 简体中⽂, 950: 繁体中⽂第⼆个参数为选项,⼀般⽤ 0 就可以了第三个参数为 ANSI 字符串的地址, 这个字符串是第⼀个参数指定的语⾔的 ANSI 字符串 (AnsiString)第四个参数为 ANSI 字符串的长度,如果⽤ -1, 就表⽰是⽤ 0 作为结束符的字符串第五个参数为转化⽣成的 unicode 字符串 (WideString) 的地址, 如果为 NULL, 就是代表计算⽣成的字符串的长度第六个参数为转化⽣成的 unicode 字符串缓存的容量,也就是有多少个UNICODE字符。
VC++中的char wchar_T和TCHAR
大家一起做一个项目,经常发现有的人爱用strcpy等标准ANSI函数,有的人爱用_tXXXX 函数,这个问题曾经搞的很混乱。
为了统一,有必要把来龙去脉搞清楚。
为了搞清这些函数,就必须理请几种字符类型的写法。
char就不用说了,先说一些wchar_t。
wchar_t是Unicode字符的数据类型,它实际定义在<string.h>里:typedef unsigned short wchar_t;不能使用类似strcpy这样的ANSI C字符串函数来处理wchar_t字符串,必须使用wcs前缀的函数,例如wcscpy。
为了让编译器识别Unicode字符串,必须以在前面加一个“L”,例如:wchar_t *szTest=L"This is a Unicode string.";下面在看看TCHAR。
如果你希望同时为ANSI和Unicode编译的源代码,那就要include TChar.h。
TCHAR是定义在其中的一个宏,它视你是否定义了_UNICODE宏而定义成char 或者wchar_t。
如果你使用了TCHAR,那么就不应该使用ANSI的strXXX函数或者Unicode 的wcsXXX函数了,而必须使用TChar.h中定义的_tcsXXX函数。
另外,为了解决刚才提到带“L”的问题,TChar.h中定义了一个宏:“_TEXT”。
以strcpy函数为例子,总结一下:.如果你想使用ANSI字符串,那么请使用这一套写法:char szString[100];strcpy(szString,"test");.如果你想使用Unicode字符串,那么请使用这一套:wchar_t szString[100];wcscpyszString,L"test");.如果你想通过定义_UNICODE宏,而编译ANSI或者Unicode字符串代码:TCHAR szString[100];_tcscpy(szString,_TEXT("test"));2.字符串及处理之三: 使用TCHAR系列方案使用TCHAR系列方案编写程序TCHAR是一种字符串类型,它让你在以MBCS和UNNICODE来build程序时可以使用同样的代码,不需要使用繁琐的宏定义来包含你的代码。
VC字符串转数字
atoi,atol,strtod,strtol,strtoul实现类型转换atof(将字符串转换成浮点型数)相关函数atoi,atol,strtod,strtol,strtoul表头文件#include <stdlib.h>定义函数double atof(const char *nptr);函数说明atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('')才结束转换,并将结果返回。
参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分,如123.456或123e-2。
返回值返回转换后的浮点型数。
附加说明atof()与使用strtod(nptr,(char**)NULL)结果相同。
atoi(将字符串转换成整型数)相关函数atof,atol,atrtod,strtol,strtoul表头文件#include<stdlib.h>定义函数int atoi(const char *nptr);函数说明atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('')才结束转换,并将结果返回。
返回值返回转换后的整型数。
附加说明atoi()与使用strtol(nptr,(char**)NULL,10);结果相同。
atol(将字符串转换成长整型数)相关函数atof,atoi,strtod,strtol,strtoul表头文件#include<stdlib.h>定义函数long atol(const char *nptr);函数说明atol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('')才结束转换,并将结果返回。
返回值返回转换后的长整型数。
常见的VC获取字符串长度的方法
常见的VC获取字符串长度的方法字符串的长度通常是指字符串中包含字符的数目,但有的时候人们需要的是字符串所占字节的数目。
常见的获取字符串长度的方法包括如下几种。
后面有源码和最终效果图1.使用sizeof获取字符串长度sizeof的含义很明确,它用以获取字符数组的字节数(当然包括结束符0)。
对于ANSI字符串和UNICODE字符串,形式如下:sizeof(cs)/sizeof(char) sizeof(ws)/sizeof(wchar_t) 可以采用类似的方式,获取到其字符的数目。
如果遇到MBCS,如"中文ABC",很显然,这种办法就无法奏效了,因为sizeof()并不知道哪个char是半个字符。
2.使用strlen()获取字符串长度strlen()及wcslen()是标准C++定义的函数,它们分别获取ASCII字符串及宽字符串的长度,如:size_t strlen( const char *string ); size_t wcslen( const wchar_t *string ); strlen()与wcslen()采取0作为字符串的结束符,并返回不包括0在内的字符数目。
3.使用CString::GetLength()获取字符串长度CStringT继承于CSimpleStringT类,该类具有函数:int GetLength( ) const throw( ); GetLength()返回字符而非字节的数目。
比如:CStringW中,"中文ABC"的GetLength()会返回5,而非10。
那么对于MBCS呢?同样,它也只能将一个字节当做一个字符,CStringA表示的"中文ABC"的GetLength()则会返回7。
4.使用std::string::size()获取字符串长度basic_string同样具有获取大小的函数:size_type length( ) const; size_type size( ) const; length()和size()的功能完全一样,它们仅仅返回字符而非字节的个数。
VC++6.0的字符与字串型
LPCSTR、LPCTSTR 都是const char *型;
LPSTR、LPTSTR都是char *型;
const char *:(指向)常量指针,指针可变而量值不能变;
char * const:指针常量,指针不能变而量值可变;
const char * const:指向常量的指针常量,指针与量值均不能变;
1、CString 不能赋值给char *型,而能赋给const char *型;
2、char *型与const char *型都能赋给CString;
由1、2可知CString与const char *可相互赋值。
3、CString重载了+=、=运算符,没有重载<<、>>运算符;
4、char */const char *型赋值给CString时先去掉末尾的'\0'再存入;
5、CString 赋值给const char *时现在末尾追加'\0'再存入;
6、CString、char *、const char *之间可用“+”进行字串连接,最后结果只能赋给CString而不能赋给const char *;
7、int不能参与“+”的字串连接。
VC 多媒体技术 MCI使用
MCI 命令列表 命令说明 命令类型
返回有关 MCI 设备的信息 为一个指定的 MCI 设备设置一个终止键 播放 Windows 指定的系统声音 关闭一个 MCI 设备 获得一个 MCI 设备的性能参数 从一个 MCI 设备得到有关的信息 初始化一个 MCI 设备 从 MCI 设备返回有关的状态 从一个磁盘文件中加载数据 暂停播放 开始播放 开始记录数据 重新开始播放或录音 将数据存储到磁盘文件中 向前或向后检索 设置设备信息 停止播放或记录 常用的 MCI 函数 类型 向 MCI 发送命令消息函数 可选命令 通用命令 系统命令
说 明: (1)mail.wav 是一个 WAV 声音文件,第 4 步时已经复制到此项目文件中。程序首先打开了 MCI 设 备,并把设备标识赋给了类的成员变量 m_MCIDeviceID。注意声音文件名不要带扩展名.wav。
6、播放声音文件 用 ClassWizard 为播放按钮(IDC_PLAY) ,在 CMyDlg 类添加鼠标单击的消息映射函 数,并加如下代码: void CMyDlg::OnPlay() { //添加控件通知消息处理代码 MCI_PLAY_PARMS mciPlayParms; mciPlayParms.dwFrom=0; //从文件开始处开始播放 mciSendCommand(m_MCIDeviceID,MCI_PLAY,MCI_FROM, (DWORD)(LPVOID)&mciPlayParms); } 7、在程序退出时停止播放并关闭 MCI 设备 用 ClassWizard 为 CMyDlg 类添加 WM_DESTROY 消息, 该消息映射函数能使程序 退出时停止声音文件的播放并关闭 MCI 设备。 void CMyDlg::OnDestroy() { CDialog::OnDestroy(); mciSendCommand(m_MCIDeviceID,MCI_STOP,MCI_WAIT,NULL); //停止播放 mciSendCommand(m_MCIDeviceID,MCI_CLOSE,MCI_WAIT,NULL); //关闭 MCI 设备 } (8)编译并运行程序,在单击“播放”按钮时,程序将播放声音;当单击“退出”按 钮或单击窗口的关闭按钮时,声音播放会立即停止。 7.2 MCI(媒体控制接口) 媒体控制接口(Media Control Interface)为 Windows 程序提供了在高层次上控制媒 体设备接口的能力。程序不必关心具体设备,就可以对激光唱机(CD) 、视盘机、波形 音频设备、视频播放设备和 MIDI 设备等媒体设备进行控制。对于程序员来说,可以把 MCI 理解为设备面板上的一排按钮,通过选择不同的按键(发送不同的 MCI 命令)就可以 让设备完成各种功能,而不必关心设备内部实现。例如,对于 play 按键,视盘机和 CD
关于VC中的字符串
关于VC中的字符串一. 字符类型和字符串(1) char,wchar_t,CHAR,BYTE,UCHAR,WCHAR,TCHAR,TBYTEchar 是C语言标准数据类型,字符型,至于由几个字节组成通常由编译器决定,一般一个字节。
wchar_t 是char的Unicode版本。
相当于unsigned short。
一般两个字节。
CHAR 和WCHAR分别是char和wchar_t的别名,决不会等同。
TCHAR 是两面派,在当前编译方式为Unicode时等价于WCHAR,而ANSI(默认)方式时又等价于CHAR。
BYTE 和UCHAR都相当于unsigned char,在取得字符编码(00~FF)的时候非常有用。
TBYTE 也是两面派,在当前编译方式为Unicode时等价于WCHAR,而ANSI(默认)方式时又等价于BYTE。
(2) PSTR,PWSTR,PCSTR,PCWSTR,LPSTR,LPWSTR,LPCSTR,LPCWSTRtypedef CHAR *PSTR;typedef WCHAR *PWSTR;typedef CONST CHAR *PCSTR;typedef CONST WCHAR *PCWSTR;typedef CHAR *LPSTR;typedef WCHAR *LPWSTR;typedef __nullterminated CONST CHAR *LPCSTR;typedef CONST WCHAR *LPCWSTR;(3) PTSTR,LPTSTR,PCTSTR,LPCTSTR在ANSI编译方式下,PTSTR和LPTSTR等价于LPSTR,在Unicode下等价于LPWSTR。
在ANSI编译方式下,PCTSTR和LPCTSTR等价于LPCSTR,在Unicode下等价于LPCWSTR。
(4) CStringA,CStringW,CString,XCHAR,YCHAR,PXSTR,PYSTR,PCXSTR,PCYSTRCstringA是由CHAR组成的字符串CStringW是由WCHAR组成的字符串CString是由TCHAR组成的字符串XCHAR表示和字符串组成字符相同的字符,YCHAR表示和字符串组成字符不同的字符PXSTR表示和字符串组成字符相同的字符串,PYSTR表示和字符串组成字符不同的字符串PCXSTR表示和字符串组成字符相同的CONST字符串,PCYSTR表示和字符串组成字符不同的CONST字符串(5) BSTR OLECHAR这两个和OLE以及COM技术有关,面向32位系统。
VC++常用数据类型
VC++常用数据类型在Visual C++.NET的所有编程方式中,我们常常要用到这样的一些基本字符串类型,如BSTR、LPSTR和LPWSTR等。
之所以出现类似上述的这些数据类型,是因为不同编程语言之间的数据交换以及对ANSI、Unicode和多字节字符集(MBCS)的支持。
那么什么是BSTR、LPSTR以及LPWSTR呢?BSTR(Basic STRing,Basic字符串)是一个OLECHAR*类型的Unicode字符串。
它被描述成一个与自动化相兼容的类型。
由于操作系统提供相应的API函数(如SysAllocString)来管理它以及一些默认的调度代码,因此BSTR实际上就是一个COM字符串,但它却在自动化技术以外的多种场合下得到广泛使用。
图1描述了BSTR的结构,其中DWORD值是字符串中实际所占用的字节数,且它的值是字符串中Unicode字符的两倍。
LPSTR和LPWSTR是Win32和VC++所使用的一种字符串数据类型。
LPSTR被定义成是一个指向以NULL(‘/0’)结尾的8位ANSI 字符数组指针,而LPWSTR是一个指向以NULL结尾的16位双字节字符数组指针。
在VC++中,还有类似的字符串类型,如LPTSTR、LPCTSTR等,它们的含义如图2所示。
例如,LPCTSTR是指“long pointer to a constant generic string”,表示“一个指向一般字符串常量的长指针类型”,与C/C++的const char*相映射,而LPTSTR映射为char*。
一般地,还有下列类型定义:#ifdef UNICODEtypedef LPWSTR LPTSTR;typedef LPCWSTR LPCTSTR;#elsetypedef LPSTR LPTSTR;typedef LPCSTR LPCTSTR;#endif二、CString、CStringA 和CStringWVisual C++.NET中将CStringT作为ATL和MFC的共享的“一般”字符串类,它有CString、CStringA和CStringW三种形式,分别操作不同字符类型的字符串。
VC之CString,wchar_t,int,string,char之间的转换
作用 char* string CString 查找指定值 _strset
_strnset
replace
replace_copy
replace_copy_if
replace_if Replace
d) 插入
作用 char* string CString 查找指定值 insert Insert
Right
Truncate
g) 移除
作用 char* string CString 移除部份值 remove Remove 移除空白值 RemoveBlanks
注:此为ATL提供,非C函数 remove_if Trim
TrimLeft
TrimRig
h) 转换大小写
作用 char* string CString 转换大小写 _strlwr
strcat( psz, cstr );//合法
strcat( psz, str );//非法,由此可见,CString可自动转换为const char*,而string不行
c) operator +=
string是最强大的,几乎可以与所有的字符串变量+=,包括CString和char*;
char*只能由指针赋值,并且是极危险的操作,建议使用strcpy或者memcpy,而且char*在声明的时候如未赋初值建议先设为NULL,以避免野指针,令你抓狂;
举例:
char *psz = NULL;
psz = new char[10]; //当然,以上的直接写成char *psz = new char[10];也是一样
3,CString -> string
VC++ CString的操作
vc中的CString的操作原著:Joseph M. Newcomer翻译:littleloach原文出处:codeproject:CString Management通过阅读本文你能学习怎么有效地使用CString。
CString 是一种非常有用的数据类型。
他们非常大程度上简化了MFC中的许多操作,使得MFC在做字符串操作的时候方便了非常多。
不管怎样,使用CString有非常多特别的技巧,特别是对于纯C背景下走出来的程式员来说有点难以学习。
这篇文章就来讨论这些技巧。
使用CString能让你对字符串的操作更加直截了当。
这篇文章不是CString的完全手册,但囊括了大部分常见基本问题。
这篇文章包括以下内容:CString 对象的连接格式化字符串(包括int 型转化为CString )CString 型转化成int 型CString 型和char* 类型的相互转化char* 转化成CStringCString 转化成char* 之一:使用LPCTSTR强制转化CString 转化成char* 之二:使用CString对象的GetBuffer方法CString 转化成char* 之三: 和控件的接口CString 型转化成BSTR 型;BSTR 型转化成CString 型;V ARIANT 型转化成CString 型;载入字符串表资源;CString 和临时对象;CString 的效率;总结下面我分别讨论。
1、CString 对象的连接能体现出CString 类型方便性特点的一个方面就字符串的连接,使用CString 类型,你能非常方便地连接两个字符串,正如下面的例子:CString gray("Gray");CString cat("Cat");CString graycat = gray + cat;要比用下面的方法好得多:char gray[] = "Gray";char cat[] = "Cat";char * graycat = malloc(strlen(gray) + strlen(cat) + 1);strcpy(graycat, gray);strcat(graycat, cat);2、格式化字符串和其用sprintf() 函数或wsprintf() 函数来格式化一个字符串,还不如用CString 对象的Format()方法:CString s;s.Format(_T("The total is %d"), total);用这种方法的好处是你不用担心用来存放格式化后数据的缓冲区是否足够大,这些工作由CString类替你完成。
VC++中的char,wchar_t,TCHAR
1.VC++中的char,wchar_t,TCHAR(转载)总体简介:由于字符编码的不同,在C++中有三种对于字符类型:char, wchar_t , TCHAR。
其实TCHAR不能算作一种类型,他紧紧是一个宏。
我们都知道,宏在预编译的时候会被替换成相应的内容。
TCHAR 在使用多字节编码时被定义成char,在Unicode编码时定义成wchar_t。
1.VC++中的char,wchar_t,TCHAR大家一起做一个项目,经常发现有的人爱用strcpy等标准ANSI函数,有的人爱用_tXXXX 函数,这个问题曾经搞的很混乱。
为了统一,有必要把来龙去脉搞清楚。
为了搞清这些函数,就必须理请几种字符类型的写法。
char就不用说了,先说一些wchar_t。
wchar_t是Unicode字符的数据类型,它实际定义在<string.h>里:typedef unsigned short wchar_t;不能使用类似strcpy这样的ANSI C字符串函数来处理wchar_t字符串,必须使用wcs 前缀的函数,例如wcscpy。
为了让编译器识别Unicode字符串,必须以在前面加一个“L”,例如:wchar_t *szTest=L"This is a Unicode string.";下面在看看TCHAR。
如果你希望同时为ANSI和Unicode编译的源代码,那就要include TChar.h。
TCHAR是定义在其中的一个宏,它视你是否定义了_UNICODE宏而定义成char或者wchar_t。
如果你使用了TCHAR,那么就不应该使用ANSI的strXXX 函数或者Unicode的wcsXXX函数了,而必须使用TChar.h中定义的_tcsXXX函数。
另外,为了解决刚才提到带“L”的问题,TChar.h中定义了一个宏:“_TEXT”。
以strcpy函数为例子,总结一下:.如果你想使用ANSI字符串,那么请使用这一套写法:char szString[100];strcpy(szString,"test");.如果你想使用Unicode字符串,那么请使用这一套:wchar_t szString[100];wcscpyszString,L"test");.如果你想通过定义_UNICODE宏,而编译ANSI或者Unicode字符串代码:TCHAR szString[100];_tcscpy(szString,_TEXT("test"));2.字符串及处理之三: 使用TCHAR系列方案使用TCHAR系列方案编写程序TCHAR是一种字符串类型,它让你在以MBCS和UNNICODE来build程序时可以使用同样的代码,不需要使用繁琐的宏定义来包含你的代码。
VC++中字符串比较和查找
VC++中字符串比较和查找常用字符串函数1. 字符串比较函数//比较两个字符串是否相同int StrCmp(LPCTSTR lpStr1,LPCTSTR lpStr2);int StrCmpN(LPCTSTR lpStr1,LPCTSTR lpStr2,int nChar);int strcmp( const char *string1, const char *string2 );int wcscmp( const wchar_t *string1, const wchar_t *string2 );int CompareString(LCID Locale, DWORD dwCmpFlags, LPCTSTR lpString1, int cchCount1, LPCTSTR lpString2, int cchCount2);2. 计算字符串长度HRESULT StringCchLength( LPCTSTR psz,size_t cchMax,size_t *pcch); //replacement for strlensize_t strlen( const char *string );size_t wcslen( const wchar_t *string );3. 字符串赋值函数HRESULT StringCchCopy(LPTSTR pszDest,size_t cchDest,LPCTSTR pszSrc); //replacement for strcpy HRESULT StringCchCopyN(LPTSTR pszDest,size_t cchDest,LPCTSTR pszSrc,size_t cchSrc); //replacement for strncpyLPTSTR StrCpy(LPTSTR psz1,LPCTSTR psz2); //存在安全问题LPTSTR StrCpyN(LPTSTR psz1,LPCTSTR psz2,int cchMax); //存在安全问题char *strcpy( char *strDestination, const char *strSource );wchar_t *wcscpy( wchar_t *strDestination, const wchar_t *strSource );char *strncpy( char *strDest, const char *strSource, size_t count );wchar_t *wcsncpy( wchar_t*strDest, const wchar_t *strSource, size_t count );4. 字符串连接函数HRESULT StringCchCat( LPTSTR pszDest,size_t cchDest,LPCTSTR pszSrc); //replacement for strcatHRESULT StringCchCatN( LPTSTR pszDest,size_t cchDest,LPCTSTR pszSrc,size_t cchMaxAppend); //replacement for strncatLPTSTR StrCat( LPTSTR psz1,LPCTSTR psz2); //存在安全问题LPTSTR StrNCat( LPTSTR pszFront,LPCTSTR pszBack,int cchMax); //存在安全问题char *strcat( char *strDestination, const char *strSource );wchar_t *wcscat( wchar_t *strDestination, const wchar_t *strSource );char *strncat( char *strDest, const char *strSource, size_t count );wchar_t *wcsncat( wchar_t *strDest, const wchar_t *strSource, size_t count );5. 字符查找函数//查找字符串中指定字符第一次出现的位置LPTSTR StrChr( LPCTSTR lpStart,TCHAR wMatch); //区分大小写char *strchr( const char *string, int c );wchar_t *wcschr( const wchar_t *string, wchar_t c );LPTSTR StrChrI( LPCTSTR lpStart,TCHAR wMatch); //不区分大小写//查找字符串中指定字符最后一次出现的位置LPTSTR StrRChr( LPCTSTR lpStart,LPCTSTR lpEnd,TCHAR wMatch); //区分大小写char *strrchr( const char*string, int c );wchar *wcsrchr( const wchar_t *string, int c );LPTSTR StrRChrI( LPCTSTR lpStart,LPCTSTR lpEnd,TCHAR wMatch); //不区分大小写*注 StrRChr()函数可以通过StrChr()函数和while循环来实现。
vc解析json字符串
VC++ 解析JSON字串一、摘要JSON的全称为:JavaS cript Obje ct No tatio n,顾名思义,JSO N 是用于标记Ja vascr ipt 对象的,JS ON 官方的解释为:JSON是一种轻量级的数据传输格式。
本文并不详细介绍JSON本身的细节,旨在讨论如何使用C++ 语言来处理JSON。
关于 JS ON 更具体的信息,可参见J SON 官网:htt p://w ww.js on.or g。
二、本文选择处理 JS ON的C++ 库本文选择一个第三方库 json cpp 来解析 JS ON。
js oncpp是比较出名的 C++ JSO N 解析库。
在 JS ON 官网也是首推的。
下载地址为:h ttp://sour cefor ge.ne t/pro jects/json cpp。
本文使用的jsonc pp 版本为:0.5.0。
三、jso ncpp在 Win dows下的编译要使用第三方源码库,第一步少不了的就是编译,将源码文件编译成我们方便使用的动态链接库、静态链接库或者静态导入库[1]。
jsc oncpp进行J SON 解析的源码文件分布在inclu de/js on、sr c/lib_json下。
其实json cpp 源码并不多,为了方便产品管理,此处没必要将其编译为动态链接库或者静态导入库,所以我们选择使用静态链接库[2]。
json cpp 已经处理的很完善了,所有编译选项都已经配置好,打开m akefi les/v s71/j soncp p.sln便可以开始编译(默认是使用VS2003 编译器的,打开时直接按照VS2005 提示转换即可)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于VC++的字符串[ 2007-4-9 12:46:00 | By: zhangming ] CString ,BSTR ,LPCTSTR之间关系和区别CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针。
CString 是一个完全独立的类,动态的TCHAR数组,封装了 + 等操作符和字符串操作方法。
typedef OLECHAR FAR* BSTR;typedef const char * LPCTSTR;vc++中各种字符串的表示法首先char* 是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。
LP的含义是长指针(long pointer)。
LPSTR是一个指向以‘\0’结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。
而LPCSTR中增加的‘C’的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。
1.LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别的,都是32位.所以这里的LP和P是等价的.2.C表示const3.T是什么东西呢,我们知道TCHAR在采用Unicode方式编译时是wchar_t,在普通时编译成char.为了满足程序代码国际化的需要,业界推出了Unicode标准,它提供了一种简单和一致的表达字符串的方法,所有字符中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法。
LPWSTR与LPCWSTR由此产生,它们的含义类似于LPSTR与LPCSTR,只是字符数据是16位的wchar_t而不是char。
然后为了实现两种编码的通用,提出了TCHAR的定义:如果定义_UNICODE,声明如下:typedef wchar_t TCHAR;如果没有定义_UNICODE,则声明如下:typedef char TCHAR;LPTSTR和LPCTSTR中的含义就是每个字符是这样的TCHAR。
CString类中的字符就是被声明为TCHAR类型的,它提供了一个封装好的类供用户方便地使用。
LPCTSTR:#ifdef _UNICODEtypedef const wchar_t * LPCTSTR;#elsetypedef const char * LPCTSTR;#endifVC常用数据类型使用转换详解先定义一些常见类型变量借以说明int i = 100;long l = 2001;float f=300.2;double d=12345.119;char username[]="女侠程佩君";char temp[200];char *buf;CString str;_variant_t v1;_bstr_t v2;一、其它数据类型转换为字符串短整型(int)itoa(i,temp,10); //将i转换为字符串放入temp中,最后一个数字表示十进制 itoa(i,temp,2); //按二进制方式转换长整型(long)ltoa(l,temp,10);二、从其它包含字符串的变量中获取指向该字符串的指针CString变量str = "2008北京奥运";buf = (LPSTR)(LPCTSTR)str;BSTR类型的_variant_t变量v1 = (_bstr_t)"程序员";buf = _com_util::ConvertBSTRToString((_bstr_t)v1);三、字符串转换为其它数据类型strcpy(temp,"123");短整型(int)i = atoi(temp);长整型(long)l = atol(temp);浮点(double)d = atof(temp);四、其它数据类型转换到CString使用CString的成员函数Format来转换,例如:整数(int)str.Format("%d",i);浮点数(float)str.Format("%f",i);字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值str = username;五、BSTR、_bstr_t与CComBSTRCComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。
char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR("数据"); //使用前需要加上头文件comutil.h反之可以使用char *p=_com_util::ConvertBSTRToString(b);六、VARIANT 、_variant_t 与 COleVariantVARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。
对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:VARIANT va;int a=2001;va.vt=VT_I4; //指明整型数据va.lVal=a; //赋值对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系: unsigned char bVal; VT_UI1short iVal; VT_I2long lVal; VT_I4float fltVal; VT_R4double dblVal; VT_R8VARIANT_BOOL boolVal; VT_BOOLSCODE scode; VT_ERRORCY cyVal; VT_CYDATE date; VT_DATEBSTR bstrVal; VT_BSTRIUnknown FAR* punkVal; VT_UNKNOWNIDispatch FAR* pdispVal; VT_DISPATCHSAFEARRAY FAR* parray; VT_ARRAY|*unsigned char FAR* pbVal; VT_BYREF|VT_UI1short FAR* piVal; VT_BYREF|VT_I2long FAR* plVal; VT_BYREF|VT_I4float FAR* pfltVal; VT_BYREF|VT_R4double FAR* pdblVal; VT_BYREF|VT_R8VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOLSCODE FAR* pscode; VT_BYREF|VT_ERRORCY FAR* pcyVal; VT_BYREF|VT_CYDATE FAR* pdate; VT_BYREF|VT_DATEBSTR FAR* pbstrVal; VT_BYREF|VT_BSTRIUnknown FAR* FAR* ppunkVal; VT_BYREF|VT_UNKNOWNIDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCHSAFEARRAY FAR* FAR* pparray; VT_ARRAY|*VARIANT FAR* pvarVal; VT_BYREF|VT_VARIANTvoid FAR* byref; VT_BYREF_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
例如:long l=222;ing i=100;_variant_t lVal(l);lVal = (long)i;COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:COleVariant v3 = "字符串", v4 = (long)1999;CString str =(BSTR)v3.pbstrVal;long i = v4.lVal;七、其它对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如:LPARAM lParam;WORD lo = LOWORD(lParam); //取低16位WORD hi = HIWORD(lParam); //取高16位对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如: WORD w;BYTE lo = LOBYTE(w); //取低8位BYTE hi = HIBYTE(w); //取高8位如何将CString类型的变量赋给char*类型的变量1、GetBuffer函数:使用CString::GetBuffer函数。
char *p;CString str="hello";p=str.GetBuffer(str.GetLength());str.ReleaseBuffer();将CString转换成char * 时CString str("aaaaaaa");strcpy(str.GetBuffer(10),"aa");str.ReleaseBuffer();当我们需要字符数组时调用GetBuffer(int n),其中n为我们需要的字符数组的长度.使用完成后一定要马上调用ReleaseBuffer();还有很重要的一点就是,在能使用const char *的地方,就不要使用char *2、memcpy:CString mCS=_T("cxl");char mch[20];memcpy(mch,mCS,20);3、用LPCTSTR强制转换:尽量不使用char *ch;CString str;ch=(LPSTR)(LPCTSTR)str;CString str = "good";char *tmp;sprintf(tmp,"%s",(LPTSTR)(LPCTSTR)str);4、CString Msg;Msg=Msg+"abc";LPTSTR lpsz;lpsz = new TCHAR[Msg.GetLength()+1];_tcscpy(lpsz, Msg);char * psz;strcpy(psz,lpsz);CString类向const char *转换char a[100];CString str("aaaaaa");strncpy(a,(LPCTSTR)str,sizeof(a));或者如下:strncpy(a,str,sizeof(a));以上两种用法都是正确地. 因为strncpy的第二个参数类型为const char *.所以编译器会自动将CString类转换成const char *.CString转LPCTSTR (const char *)CString cStr;const char *lpctStr=(LPCTSTR)cStr;LPCTSTR转CStringLPCTSTR lpctStr;CString cStr=lpctStr;将char*类型的变量赋给CString型的变量可以直接赋值,如:CString myString = "This is a test";也可以利用构造函数,如:CString s1("Tom");将CString类型的变量赋给char []类型(字符串)的变量1、sprintf()函数CString str = "good";char tmp[200] ;sprintf(tmp, "%s",(LPCSTR)str);(LPCSTR)str这种强制转换相当于(LPTSTR)(LPCTSTR)strCString类的变量需要转换为(char*)的时,使用(LPTSTR)(LPCTSTR)str然而,LPCTSTR是const char *,也就是说,得到的字符串是不可写的!将其强制转换成L PTSTR去掉const,是极为危险的!一不留神就会完蛋!要得到char *,应该用GetBuffer()或GetBufferSetLength(),用完后再调用ReleaseBuffer()。