C++ char/string/CString等之间的数据类型转换

1、char[]/char* 转 string

(1) string类型头文件 和 变量声明:

#include <string>

std::string str = "abdccc";

(2)string初始化 方式

#include <string>

char cstr[256] = "abcdefg"; 

std::string str(cstr); (初始化时 char[]/char* 转string)

(3)string 一般赋值 方式

#include <string>

char cstr[256] = "abcdefg";

std::string str;
str = cstr; (一般赋值 char[]/char* 转string)

(4)string 内存拷贝的方式

std::string str;
char strTest[256] = "abc123!!\n00\n";
memcpy(str.c_str(), strTest, 256); //错误, 错误信息“ “const char*” 类型的实参, 与“void*” 类型的形参 不兼容”

2、char[]/char* 转 CString

(1) CString类型头文件 和 变量声明:

#include "pch.h" 或 #include "stdafx.h" (根据编译器版本确定)

CString Cstr = _T("abc");

(2)CString初始化 方式

#include "pch.h" 

char cstr[256] = "abcdefg";

CString Cstr(cstr); (初始化时 char[]/char* 转CString)

(3)CString 一般赋值 方式

#include "pch.h"

char cstr[256] = "abcdefg";

CString Cstr;
Cstr = cstr; (一般赋值 char[]/char* 转CString)

(4)CString 函数转换 方式

char buffTmp1[256];
char buffTmp2[256];

//case 1 is OK
WCHAR buffTmp11[256];
WCHAR buffTmp21[256];
CharToWCharConv(buffTmp1, buffTmp11);
CharToWCharConv(buffTmp2, buffTmp21);

//case 2 is OK
CString buffCStr1;
CString buffCStr2;
CharToWCharConv(buffTmp1, buffCStr1.GetBufferSetLength(256));
CharToWCharConv(buffTmp2, buffCStr2.GetBufferSetLength(256));

/************************************************************************
/* 函数名: CharToWCharConv
/* 功能描述: CharToWChar
/* 输入:LPSTR lpMultiByteStr: 存储数据的char数组
/* 输出:LPWSTR lpWideCharStr: 存储转换后的wchar数据指针
/* 返回值:0:正常, -1:空指针
************************************************************************/
int CharToWCharConv(LPSTR lpMultiByteStr, LPWSTR lpWideCharStr)
{
    int re = 0;
    if ((lpWideCharStr != NULL) && (lpMultiByteStr != NULL))
    {
        int len = MultiByteToWideChar(CP_ACP, 0, lpMultiByteStr,  strlen(lpMultiByteStr), NULL, 0);
        MultiByteToWideChar(CP_ACP, 0, lpMultiByteStr, strlen(lpMultiByteStr),  lpWideCharStr, len);
        lpWideCharStr[len] = '\0';
    }
    else
    {
        re = -1;
    }
    return re;
}

(5)CString 内存拷贝的方式

CString Cstr;
char strTest[256] = "abc123!!\n00\n";
memcpy(Cstr.GetBuffer(), strTest, 256); //正确

3、string 转 CString

(1)CString初始化 方式

char testabc[256] = "abc123!!\n00\n";
std::string str;
str = testabc;
CString CStr(str); //错误, 编译异常
CString CStr(str.c_str()); //正确, 本质上还是转换为cha* 进行CString

(2)CString 一般赋值 方式

char testabc[256] = "abc123!!\n00\n";
std::string str;
str = testabc;
CString CStr; 
CStr = str; //错误, 编译异常
CStr = str.c_str();//正确, 本质上还是转换为cha* 进行CString

(3)CString 内存拷贝的方式

CString Cstr;
std::string str = "abc123!!\n00\n\n";
memcpy(Cstr.GetBuffer(), str.c_str(), 256);//正确

4、CString 转 string

(1)string初始化 方式

char testabc[256] = "abc123!!\n00\n";
CString CStr = testabc;
std::string str(CStr.GetBuffer()); //将CStr缓存中的字符数据全部赋值给str, str缓存数据为“abc123!!\n00\n”
std::string str1(CStr.GetBufferSetLength(3)); //将CStr缓存中的 前3 字符数据赋值给str, str缓存数据为“abc”

(2)string 一般赋值 方式

char testabc[256] = "abc123!!\n00\n";
std::string str;
CString CStr = testabc;
str = CStr.GetBuffer(); //将CStr缓存中的字符数据全部赋值给str, str缓存数据为“abc123!!\n00\n”
str = CStr.GetBufferSetLength(3); //将CStr缓存中的 前3 字符数据赋值给str, str缓存数据为“abc”

(3)string 内存拷贝的方式

CString Cstr = "abc123!!\n00\n\n";
std::string str;
memcpy(str.c_str(), Cstr.GetBuffer(), 256); //错误, 错误信息“ “const char*” 类型的实参, 与“void*” 类型的形参 不兼容”

5、CString 转 char[]/char*

(1)char[]/char* 初始化 方式

暂时未发现可以在初始化 将 CString转换为 char[]/char*;

(2)char[]/char* 内存拷贝的方式

CString CStr = "abc123!!\n00\n";
char strTest[256], strTest1[256];
memcpy(strTest, CStr.GetBuffer(), 256); //拷贝 全部 字符, strTest为"abc123!!\n00\n"
memcpy(strTest1, CStr.GetBufferSetLength(4), 256); //拷贝 前4 个字符, strTest1 为 "abc1"

(3)char[]/char* 函数转换 方式

char strTest[256];
CString CStr = "abc123"
WCharToCharConv(CStr, 256, strTest);

/************************************************************************
/* 函数名: WCharToCharConv
/* 功能描述: WCharToChar
/* 输入:LPCWCH lpWideCharStr: wchar字符类型数据指针
/*       int lenArray: 存储转换后字符串的char数组大小
/* 输出:LPSTR lpMultiByteStr: 存储转换后数据的char数组
/* 返回值:0:正常, 2:空指针, 1: 字符串过长
************************************************************************/
int WCharToCharConv(LPCWCH lpWideCharStr, int lenArray, LPSTR lpMultiByteStr)
{
    int re = 0;
    if ((lpWideCharStr != NULL) && (lpMultiByteStr != NULL))
    {
        //计算 存储Wchar数据 所需的 char数组 长度
        int len = WideCharToMultiByte(CP_ACP, 0, lpWideCharStr,  wcslen(lpWideCharStr), NULL, 0, NULL, NULL);
        //判断char数组长度是否足够大
        if ((len + 1) > lenArray)
        {
            MessageBox(NULL, TEXT("wchar转char时, 用于存储的char数组过小, 请增大char数组大小"), TEXT("错误"), MB_ICONHAND | MB_OK);
            re = 1;
        }
        else
        {
            WideCharToMultiByte(CP_ACP, 0, lpWideCharStr, wcslen(lpWideCharStr),  lpMultiByteStr, len, NULL, NULL);
            lpMultiByteStr[len] = '\0';
        }
    }
    else
    {
        re = -1;
    }
    return re;
}

6、string 转 char[]/char*

(1)char[]/char* 初始化 方式

暂时未发现可以在初始化 将 string转换为 char[]/char*;

(2)char[]/char* 内存拷贝的方式

std::string str = "abc123!!\n00\n";
char strTest[256];
memcpy(strTest, str.c_str(), 256);
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值