Windows / VS下不同类型变量转换

[时间:2016-07] [状态:Open]
[关键词:windows,vs,mfc,类型转换]

在实际编码中经常遇到不同类型及编码方式的字符串、变量之间的转换,比如Unicode->char、int->string等等。本文主要介绍这些格式如何相互处理,也作为一个总结,用于在未来中不同的应用。

string <---> char *之间的转换

string --> char *

方法一:
char *p = string.c_str();
方法二:
一个一个字符的赋值
char *p = new char[sring的长度+1];
p[string的长度]='/0';
但是要注意最后赋值'/0'!!!

char * StringToChar(string &str)
{
	int len = str.length();
	char * p = new char[len+1];
	for (int i = 0; i < len; i++)
	{
		p[i] = str[i];
	}
	p[len] = '/0';
}

char * --> string

直接使用string的构造函数或者string::assign函数。

string <---> wstring之间的转换

string --> wstring

wstring s2ws(const string& s)
{
	_bstr_t t = s.c_str();
	wchar_t* pwchar = (wchar_t*)t;
	wstring result = pwchar;
	return result;
}

wstring --> string

string ws2s(const wstring& ws)
{
	_bstr_t t = ws.c_str();
	char* pchar = (char*)t;
	string result = pchar;
	return result;
}

string <---> CString 之间的转换

string --> CString

方法一:
CString.format("%s", string.c_str());
方法二:

CString StringToCString(string str)
{
	CString result;
	for (int i=0;i<(int)str.length();i++)
	{
	 	result+=str[i];
	}
	return result;
}

CString --> string

方法一:

void ConvertCString2string(CString& strSrc, std::string& strDes)
{
#ifndef UNICODE
	strDes = strSrc;
#else USES_CONVERSION;
	strDes = W2A(strSrc.LockBuffer());
	strSrc.UnlockBuffer();
#endif
}

方法二:

CString str;
string s(str.GetBuffer());  
str.ReleaseBuffer();

GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
方法三:

string CStringToString(CString cstr)
{
	string result(cstr.GetLength(), '\0');
	for (int i=0;i<cstr.GetLength();i++)
	{
		result[i]=(char)cstr[i];
	}
	return result;
}

char * <---> TCHAR *之间的转换

首先说明下:char *是ANSI编码字符的char(STL提供);
TCHAR是UNICODE编码字符的wchar_t;

char * --> TCHAR *

wchar_t *chr2wch(const char *buffer)
{
	size_t len = strlen(buffer);
	size_t wlen = MultiByteToWideChar(CP_ACP, 0, (const char*)buffer, int(len), NULL, 0);
	wchar_t *wBuf = new wchar_t[wlen + 1];
	MultiByteToWideChar(CP_ACP, 0, (const char*)buffer, int(len), wBuf, int(wlen));
	return wBuf;
}

TCHAR* --> char *

char * wch2chr(LPCTSTR lpString)
{
	// Calculate unicode string length
	UINT len = wcslen(lpString)*2;
	char *buf = (char *)malloc(len);
	UINT i = wcstombs(buf,lpString,len);
	return buf;
}

wstring <---> CString之间的转换

wstring --> CString

直接使用CString的构造函数、赋值函数或者Format函数,配合wstring的c_str函数;

CString --> wstring

std::wstring str = filename.GetString();// 在Unicode或者多字符环境下使用;

CString <---> char *之间的转换

CString --> char *

方法一:

CString cstr(asdd);
const char* ch = (LPCTSTR)cstr;

方法二:

CString   str= "I am good "; 
char*   lp=str.GetBuffer(str.GetLength()); 
str.ReleaseBuffer(); 

char * ---> CString

CString提供一系列操作可以直接将char *转化为CString,比如构造函数、赋值运算符、Format函数等(注意编码方式)。
举个简单的例子:
char * pStr = “123456”; CString str; str.Format(“%s”, pStr);

char * <---> TCHAR *之间的转换

TCHAR* --> char*

/*********************************************************************** 
* 函数: THCAR2Char 
* 描述:将TCHAR* 转换为 char* 
***********************************************************************\ 
char* THCAR2char(TCHAR* tchStr) 
{ 
	int iLen = 2*wcslen(tchStr);//CString,TCHAR汉字算一个字符,因此不用普通计算长度 
	char* chRtn = new char[iLen+1] 
	wcstombs(chRtn,tchStr,iLen+1);//转换成功返回为非负值 
	return chRtn; 
}

char * --> TCHAR *

定义了UNICODE宏之后,TCHAR就是宽字符wchar_t,否则TCHAR跟char是一样的;

char * <---> int之间的转换

char * --> int

方法一:
使用C提供的atoi函数(或者相关的)

 #include <stdlib.h> 
 int atoi(const char *nptr); 
 long atol(const char *nptr); 
 long long atoll(const char *nptr); 
 long long atoq(const char *nptr); 

方法二:
C提供的sscanf函数,用法与scanf类似;
方法三:
C++提供的istrstream;

int --> char *

方法一:
在stdlib.h中有个函数itoa()
itoa的用法:
itoa(i,num,10);
i 需要转换成字符的数字
num 转换后保存字符的变量
方法二:
使用C的sprintf,用法与fprintf类似,除了第一个参数不同,注意溢出问题;
方法三:
使用C++提供的流输出ostrstream;

posted @ 2016-08-31 12:45  Tocy  阅读(1168)  评论(0编辑  收藏  举报