• 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;

  • 相关阅读:
    c#查找窗口的两种办法
    也说自动化测试
    定位bug的基本要求
    c#调用GetModuleFileNameEx获取进程路径
    对比PG数据库结构是否一致的方法
    C#调用endtask
    提bug
    接口测试的结果校验
    ProcessExplorer使用分享
    C++如何在r3静态调用NT函数
  • 原文地址:https://www.cnblogs.com/tocy/p/vs-variable-type-cast.html
Copyright © 2020-2023  润新知