CString转char * ,string

CString头文件#include <afx.h>

string头文件#include <string.h>

 

1、CString转char *

CString cstr;

char *p =(LPSTR)(LPCTSTR)cstr;

2、string转 CString
CString.format(”%s”, string.c_str());

c_str()确实比data()要好.

3、char转 CString
CString.format(”%s”, char*);

4、char转 string
string s(char *);

只能初始化,在不是初始化的地方最好还是用assign().

5、string转 char *
char *p = string.c_str();

6、CString转 string
string s(CString.GetBuffer());

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

―――――――――――――――――――――

C++标准函数库》中说的
有三个函数可以将字符串的内容转换为字符数组和C―string
1、data(),返回没有”/0“的字符串数组
2、c_str(),返回有”/0“的字符串数组
3、copy()

―――――――――――――――――――――

 

CString与int、char*、char[100]之间的转换--

1、CString互转int

(1)将字符转换为整数,可以使用atoi、_atoi64或atol。
(2)将数字转换为CString变量,可以使用CString的Format函数。如
    CString s;
    int i = 64;
    s.Format(”%d”, i)
Format函数的功能很强,值得你研究一下。

voidCStrDlg::OnButton1()
{
   // TODO: Add your control notificationhandler code here
   CString
   ss=”1212.12″;
   int temp=atoi(ss);
   CString aa;
   aa.Format(”%d”,temp);
   AfxMessageBox(”var is ” + aa);
}

sart.Format(”%s”,buf);

 

2、CString互转char*

CString strtest;
char * charpoint;

///char * TO cstring
charpoint=”give string a value”;
strtest=charpoint;

///cstring TO char *
charpoint=strtest.GetBuffer(strtest.GetLength());

标准C里没有string,char*==char []==string

可以用CString.Format(”%s”,char *)这个方法来将char *转成CString。要把CString转成char*,用操作符(LPCSTR)CString就可以了。

 

3、CString转换 char[100]

///char[100] TOcstring

char a[100];
CString str(”aaaaaa”);

///cstring TO char[100]

strncpy(a,(LPCTSTR)str,sizeof(a));

<think>好的,我现在需要解决用户的问题:在MFC中将Unicode编码的CString安全地换为char*。根据用户提供的引用资料,我需要综合这些信息,给出正确的换方法。 首先,用户提到他们使用的是Unicode字符集,所以CString实际上是CStringW,存储的是宽字符。换的关键在于将宽字符(wchar_t)换为多字节字符(char)。这通常涉及到编码换,比如使用WideCharToMultiByte函数。 查看引用资料,引用[4]提供了一种方法:先用CStringA进行换,然后获取缓冲区。CStringA是MFC中处理ANSI字符的类,会自动进行宽字符到多字节的换。但需要注意代码页是否正确,否则可能会有乱码。引用[5]提到使用(LPSTR)(LPCSTR)强制换,但这种方法在Unicode下可能有问题,因为LPCSTR会得到宽字符的指针,强制换可能导致错误。 所以更安全的方法应该是使用CStringA。步骤大概是:将CString换为CStringA,然后通过GetBuffer()获取const char*,再复制到char*中。或者使用WideCharToMultiByte函数手动换,指定代码页为CP_ACP或CP_UTF8,取决于需求。 另外,引用[2]提到使用string的c_str()方法,但需要将char*定义为const char*。但用户需要的是char*,可能需要复制内容到非const的缓冲区。 需要注意的地方:换时的代码页是否正确,例如使用CP_ACP(系统默认ANSI)还是CP_UTF8。如果目标是多字节字符串,可能需要处理字符长度的变化,确保缓冲区足够大。 综合这些,正确的步骤应该是: 1. 将CString换为CStringA,使用正确的代码页。 2. 从CStringA获取const char*。 3. 如果需要可修改的char*,则分配内存并复制内容。 示例代码可能如下: CString strUnicode = L"测试文本"; CStringA strAnsi(strUnicode); const char* pConstChar = strAnsi.GetBuffer(); // 如果需要非const的char*,复制一份 char* pChar = new char[strAnsi.GetLength() + 1]; strcpy_s(pChar, strAnsi.GetLength() + 1, strAnsi); 或者使用WideCharToMultiByte: CString strUnicode = L"测试"; int len = WideCharToMultiByte(CP_UTF8, 0, strUnicode, -1, NULL, 0, NULL, NULL); char* pChar = new char[len]; WideCharToMultiByte(CP_UTF8, 0, strUnicode, -1, pChar, len, NULL, NULL); 但用户可能需要更简洁的MFC方法,所以CStringA换更直接。同时要注意释放内存,避免泄漏。 还要检查是否有其他注意事项,比如是否需要处理异常字符,换失败的情况等。但根据引用资料,使用CStringA是比较推荐的方法,如引用[4]中的示例。所以最终的解决方案应该基于CStringA,并结合GetBuffer来获取指针。</think>在MFC中将Unicode编码的`CString`安全换为`char*`需要正确处理宽字符到多字节字符的编码换。以下是分步实现方法: --- ### **步骤1:使用CStringA进行中间** `CStringA`是MFC中用于处理ANSI或多字节字符的类,能自动完成宽字符到多字节的换。需注意代码页(如UTF-8或系统默认ANSI)是否匹配需求。 ```cpp CString strUnicode = L"Unicode文本示例"; // Unicode CString CStringA strAnsi(strUnicode); // 换为ANSI CStringA const char* pConstChar = strAnsi; // 获取const char* ``` --- ### **步骤2:生成可修改的char*** 若需非`const`的`char*`,需手动复制数据以避免直接操作`CStringA`内部缓冲区: ```cpp char* pChar = new char[strAnsi.GetLength() + 1]; strcpy_s(pChar, strAnsi.GetLength() + 1, strAnsi.GetString()); // 使用后需释放内存: delete[] pChar; ``` --- ### **步骤3(可选):指定代码页** 若需UTF-8编码,可通过`WideCharToMultiByte`显式换: ```cpp CString strUnicode = L"需要UTF-8的文本"; int len = WideCharToMultiByte(CP_UTF8, 0, strUnicode, -1, NULL, 0, NULL, NULL); char* pUtf8 = new char[len]; WideCharToMultiByte(CP_UTF8, 0, strUnicode, -1, pUtf8, len, NULL, NULL); // 使用后释放内存: delete[] pUtf8; ``` --- ### **注意事项** 1. **代码页一致性**:默认`CStringA`使用系统ANSI代码页,若需UTF-8需显式指定[^4]。 2. **内存管理**:手动分配的`char*`必须通过`delete[]`释放,避免内存泄漏。 3. **安全性**:避免强制换(如`(LPSTR)(LPCSTR)`),此类方法在Unicode环境下可能出错[^5]。 --- ### **完整示例代码** ```cpp // Unicode CStringchar*(系统ANSI代码页) CString strUnicode = L"Hello, 世界!"; CStringA strAnsi(strUnicode); // 换为ANSI const char* pConst = strAnsi; // 直接获取const char* // 生成可修改的char* char* pChar = new char[strAnsi.GetLength() + 1]; strcpy_s(pChar, strAnsi.GetLength() + 1, strAnsi.GetString()); // 使用pChar... delete[] pChar; // 必须释放内存 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值