关于C++字符串数据类型转换的个人小结

以下内容仅供参考

萌新学习中尝试的几种方法,对原理不太熟悉,不能保证全部正确。

1、unsigned char*

unsigned char* 转 char*:

char* cData = (char*)ucData;

unsigned char* 转 string:

string sOut = reinterpret_cast<const char*>(ucOut);

unsigned char* 转 CString:

CString csTxt = (CStringW)ucTxt;

2、char*

char* 转 unsigned char*:

unsigned char* ucIn = (unsigned char*)cImagePath;
// 或:
unsigned char* ucIn = reinterpret_cast<unsigned char*> (cImagePath);

char* 转 string:

string sOut = cData;

char* 转 CString:

// ①、定义时赋值:
CString csFileName = CA2W(cImageType); 
// 或:
CString csFileName(cImageType);

// ②、拼接CString时:
csFileName = csFileName + CA2W(cImageType);

// ③、定义后赋值:
csFileName = cImageType;

3、string

string 转 const char*:

const char* cImageType = sImageType.c_str();

string 转 char[]:

string s = "12345";
char c[6];
strcpy(c, s.c_str());

string 转 unsigned char*:

unsigned char* ucTxt = (unsigned char*)sTxt.c_str();

string 转 CString:

// ①、定义时赋值:
CString csFileName = CA2W(sFileName.c_str()); 

// ②、定义后赋值:
csFileName = sFileName.c_str();
// (使用的是=运算符的重载)

4、CString

CString 转 string:

string sTxt = CW2A(csTxt);
// (省略了csTxt.GetString(),好像没问题)
// 或:
string sTxt = CStringA(csTxt);

CString 转 char*:

CString cstr = _T("123");
int len = WideCharToMultiByte(CP_ACP, 0, cstr, -1, NULL, 0, NULL, NULL);
char* ptxtTemp = new char[len + 1];
WideCharToMultiByte(CP_ACP, 0, cstr, -1, ptxtTemp, len, NULL, NULL);
ptxtTemp[len] = '\0';

// 或:
USES_CONVERSION;
char* cTest = W2A(csTest);

CString 转 unsigned char*:

USES_CONVERSION;
unsigned char* cTest = (unsigned char*)W2A(csTest);

另外,CString 在定义时赋定值,如:

CString str = _T("hello");
// 或:
CString p = L"123";

5、其他

CW2A 将宽字符集(Unicode)转化为多字符集(ASCII)
CA2W 将多字符集(ASCII)转化为宽字符集(Unicode)
USES_CONVERSION是ATL中的一个宏定义。用于编码转换(用的比较多的是CString向LPCWSTR转换)
MultiByteToWideChar 多字节转宽字节
WideCharToMultiByte 宽字节转多字节

不能将字符串常量赋值给字符数组(除非是定义时赋值):

struct S 
{
    char name[10];
};

int main()
{
    S a;
    a.name = "abc";
}

编译器报错“表达式必须为可修改的左值”。原因:不能将字符串常量赋值给字符数组(除非是定义时赋值!如char a[10] = “abc”)。同样的,字符数组也不能赋值给字符数组。因为name作为数组名,是一个指针常量,储存了这个字符数组的起始地址,不可指向其他字符串、字符数组的地址,不然成了内存泄漏。

解决方法有非常多种:
①使用string替代字符数组。
②使用strcpy函数:strcpy(a.name, "abc");
③使用字符指针:char *name;

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值