c++类型转换
该篇文章分两个部分:
1、数据类型说明
2、数据类型转换代码实现
一、数据类型说明:
int:c/c++中的整数型,该类型变量在32位编译器中占4个字节即32位
char:c/c++中的字符型,该类型变量在32位编译器中占1个字节即8位
wchar_t:c/c++中宽字符型,该类型变量在32位编译器中占2个字节即16位
c/c++中的指针类型:指针类型变量在32位编译器中占4个字节即32位,类似于int型,指针变量中存放的是一块内存的地址
string、wstring:均为标准c++库中类包含在头文件<string>中,类的内部实际上是维护一个char*指针变量
CString:MFC封装的字符串类包含在头文件<afx.h>或者<afxwin.h>中,类的内部也是维护一个char*指针变量
还有一类类型名全部大写的如:TCHAR、LPSTR...这一类数据类型属于微软定义的宏,一般多用于WindowsAPI中参数类型或者返回值类型下图是一个对应表:
| 类型 | 在ANSI环境下 | 在UniCode环境下 |
| WCHAR | wchar_t | wchar_t |
| LPSTR | char* | char* |
| LPCSTR | const char* | const char* |
| LPWSTR | wchar_t* | wchar_t* |
| LPCWSTR | const wchar_t* | const wchar_t* |
| TCHAR | char | wchar_t |
| LPTSTR | char* | wchar_t* |
| LPCTSTR | const char* | const wchar_t* |
二、实现代码
1 #pragma once 2 3 /************************************************************************/ 4 /* win7 32位操作系统 vs2010旗舰版 5 Win32控制台程序 项目属性中将MFC使用设为在共享DLL中使用MFC 6 */ 7 /************************************************************************/ 8 9 10 #include<afxwin.h> //使用CString类时要包含该头文件 11 #include <string> //使用string类 wstring类时要包含该同文件 12 13 class TypeConver 14 { 15 public: 16 TypeConver(void); 17 ~TypeConver(void); 18 19 public: 20 void Release(); 21 22 wchar_t* CToWC(const char* pch); //char*->wchar_t* 23 char* WCToC(const wchar_t* pwch); //wchar_t*->char* 24 //char*->string wchar_t*->wstring可以直接赋值 25 char* StrToC(const std::string& str ); //string->char* 26 char* WStrToC(const std::wstring& wstr); //wstring->char* 27 wchar_t* StrToWC(const std::string& str); //string->wchar_t* 28 wchar_t* WStrToWC(const std::wstring& wstr); //wstring->wchar_t* 29 std::wstring StrToWStr(const std::string& str); //string->wstring 30 std::string WStrToStr(const std::wstring& wstr); //wstring->string 31 32 CString CToCStr(const char* pch); //char*->CString 33 CString StrToCStr(const std::string& str); //string->CString 34 TCHAR* CStrToTC( CString& cstr); //CString->TCHAR 35 36 char* IntToC(const int& n); //int->char* 37 int CToInt(const char* pch); //char*->int 38 CString IntToCStr(const int& n); //int->CString 39 int CStrToInt(const CString& cstr); //CString->int 40 41 private: 42 char* m_char; 43 wchar_t* m_wchar; 44 45 };
1 #include "StdAfx.h" 2 #include "TypeConver.h" 3 4 5 TypeConver::TypeConver(void):m_char(NULL),m_wchar(NULL)//初始化列表给私有成员变量赋值 6 { 7 } 8 9 TypeConver::~TypeConver(void) 10 { 11 //在析构函数中释放分配的内存 12 Release(); 13 } 14 15 void TypeConver::Release() 16 { 17 if(m_char){ 18 delete[] m_char; 19 m_char=NULL; 20 } 21 if(m_wchar){ 22 delete[] m_wchar; 23 m_wchar=NULL; 24 } 25 } 26 27 wchar_t* TypeConver::CToWC(const char* pch) 28 { 29 Release(); 30 //第一次调用该函数获得要转化字符串长度(不包含字符串最后的'\0'结束标志) 31 int len=MultiByteToWideChar(CP_ACP,0,pch,strlen(pch),NULL,0); 32 m_wchar=new wchar_t[len+1]; //动态分配内存 33 34 /*本来想用下面这条语句为上面分配的内存赋初值的但是出现中断 35 猜测原因:wchar_t占据2字节,与memset赋值单元不匹配 36 memset(pch,'0',(len+1)*sizeof(wchar_t)); */ 37 38 39 /*有很多API都会有这种用法: 40 第一次调用某个API获得一个参数,第二次调用同样的API将第一次获得的参数传进去得到最终想要的结果 41 */ 42 //第二次调用该函数将pch所指的字符串复制到上面分配的内存空间上,该空间首地址为m_wchar的 43 MultiByteToWideChar(CP_ACP,0,pch,strlen(pch),m_wchar,(len+1)*sizeof(wchar_t)); 44 m_wchar[len]='\0';//将m_wchar指向的字符串最后一个字符设为字符串结束标识符 45 return m_wchar; 46 } 47 48 char* TypeConver::WCToC(const wchar_t* pwch) 49 { 50 Release(); 51 int len=WideCharToMultiByte(CP_ACP,0,pwch,wcslen(pwch),NULL,0,NULL,NULL); 52 m_char=new char[len+1]; 53 //memset():作用是在一段内存块中填充某个给定的值,它对较大的结构体或数组进行清零操作的一种最快方法。 54 //字符型占据内存大小是1Byte,而memset函数也是以字节为单位进行赋值的,所以没有问题 55 memset(m_char,0,(len+1)*sizeof(char)); 56 WideCharToMultiByte(CP_ACP,0,pwch,wcslen(pwch),m_char,(len+1)*sizeof(char),NULL,NULL); 57 m_char[len]='\0'; 58 return m_char; 59 } 60 61 char* TypeConver::StrToC(const std::string& str ) 62 { 63 //return str.c_str();//报错:无法从"const char *"转换为"char *" 64 /*const_cast<>() 作用: 65 1、常量指针被转化成非常量的指针,并且仍然指向原来的对象; 66 2、常量引用被转换成非常量的引用,并且仍然指向原来的对象;*/ 67 return const_cast<char*>(str.c_str()); 68 } 69 70 char* TypeConver::WStrToC(const std::wstring& wstr) 71 { 72 const wchar_t* pwch=wstr.c_str(); 73 return WCToC(pwch); 74 } 75 76 wchar_t* TypeConver::StrToWC(const std::string& str) 77 { 78 const char* pch=str.c_str(); 79 return CToWC(pch); 80 } 81 82 wchar_t* TypeConver::WStrToWC(const std::wstring& wstr) 83 { 84 return const_cast<wchar_t*>(wstr.c_str()); 85 } 86 87 std::wstring TypeConver::StrToWStr(const std::string& str) 88 { 89 std::wstring wstr; 90 wchar_t* pwch=StrToWC(str); 91 wstr.append(pwch); 92 return wstr; 93 } 94 95 std::string TypeConver::WStrToStr(const std::wstring& wstr) 96 { 97 std::string str; 98 char* pch=WStrToC(wstr); 99 str.append(pch); 100 return str; 101 } 102 103 CString TypeConver::CToCStr(const char* pch) 104 { 105 return CString(pch); 106 } 107 108 CString TypeConver::StrToCStr(const std::string& str) 109 { 110 return CString(str.c_str()); 111 } 112 113 TCHAR* TypeConver::CStrToTC(CString& cstr) 114 { 115 TCHAR* pch=cstr.GetBuffer(cstr.GetLength()); 116 return pch; 117 } 118 119 char* TypeConver::IntToC(const int& n) 120 { 121 Release(); 122 /*int占4个字节,n最大值为2^31-1 是一个10位数 所以这里开辟一个包含11个字节的内存空间, 123 个人想法如果有错或者更好的方法欢迎交流*/ 124 m_char=new char[11]; 125 _itoa_s(n,m_char,11,10); 126 return m_char; 127 } 128 129 int TypeConver::CToInt(const char* pch) 130 { 131 return atoi(pch); 132 } 133 134 CString TypeConver::IntToCStr(const int& n) 135 { 136 CString cstr; 137 cstr.Format(_T("%d"),n); 138 return cstr; 139 } 140 141 int TypeConver::CStrToInt(const CString& cstr) 142 { 143 return _ttoi(cstr); 144 }
声明:
(1)每篇文章中内容均为个人看法或见解,不能保证绝对正确,如果有错误或有更好的改进方案欢迎指出
(2)每篇文章最后都会附上该篇文章所参考的资料,如有侵权请参考资料的作者及时与我(persistzpf@163.com)联系,我会及时删除侵权内容
【参考资料 感谢作者】
http://www.cnblogs.com/Dageking/p/3520570.html
http://www.cnblogs.com/ziwuge/archive/2011/06/19/2084608.html
从这一刻开始,积累,总结

浙公网安备 33010602011771号