zoukankan      html  css  js  c++  java
  • 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(), '');
    	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;

  • 相关阅读:
    Uva 10779 collector's problem
    poj 2728 最优比率树(最小生成树问题)
    LA 3126 二分图匹配 最小路径覆盖
    poj 1149 最大流构图
    Step By Step(Java XML篇)
    Step By Step(Java 输入输出篇)
    Step By Step(Java 集合篇)
    Step By Step(Java 线程篇)
    Step By Step(Java 反射篇)
    Step By Step(Java 国际化篇)
  • 原文地址:https://www.cnblogs.com/tocy/p/vs-variable-type-cast.html
Copyright © 2011-2022 走看看