CString and char *

1、多字符集设置下:
CString To char*:
1)、
CString str; 
char *buf = str.GetBuffer();
2)、
CString str;
char *buf = (LPSTR)(LPCSTR)str;


char* To CString
1)、
char *buf;
CString str(buf);


2、Unicode字符集下:
CString To char*:
1)、
CString st =_T("123");  
int len =WideCharToMultiByte(CP_ACP,0,str,-1,NULL,0,NULL,NULL);  
char *buf =new char[len +1];  
WideCharToMultiByte(CP_ACP,0,str,-1,buf,len,NULL,NULL );  
  
//...  
delete[] buf;


char* To CString
1)、
char *buf;
CString str(buf); 


3、方法:
static std::string Unicode2ANSI(LPCWSTR lpszSrc)
{
std::string sResult;
if (lpszSrc != NULL)
{
int  nANSILen = WideCharToMultiByte(CP_ACP, 0, lpszSrc, -1, NULL, 0, NULL, NULL);
char* pANSI = new char[nANSILen + 1];
if (pANSI != NULL)
{
ZeroMemory(pANSI, nANSILen + 1);
WideCharToMultiByte(CP_ACP, 0, lpszSrc, -1, pANSI, nANSILen, NULL, NULL);
sResult = pANSI;
delete[] pANSI;
}

return sResult;
}


static std::wstring ANSI2Unicode(LPCSTR lpszSrc)
{
std::wstring sResult;
if (lpszSrc != NULL)
{
int nUnicodeLen = MultiByteToWideChar(CP_ACP, 0, lpszSrc, -1, NULL, 0);
LPWSTR pUnicode = new WCHAR[nUnicodeLen + 1];
if (pUnicode != NULL)
{
ZeroMemory((void*)pUnicode, (nUnicodeLen + 1) * sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, lpszSrc,-1, pUnicode, nUnicodeLen);
sResult = pUnicode;
delete[] pUnicode;
}
}
return sResult;
}
--------------------- 

转载于:https://my.oschina.net/u/4156808/blog/3070271

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码有一些可以改进的地方,以下是一种可能的改进方案: 1. 在构造函数和 Set() 函数中使用 strncpy() 函数来复制字符串,以防止缓冲区溢出。 2. 将默认参数的值从函数实现中移除,放到函数声明中。 3. 在 Show() 函数中使用 cout 输出时,可以使用成员函数来访问数据成员,而不是直接访问数据成员。 4. 在输入时,应该使用 getline() 函数来读取整行数据,而不是使用 >> 运算符,以防止输入的字符串长度超过缓冲区长度。 改进后的代码如下: ```cpp #include<iostream> #include<cstring> using namespace std; class Country { private: char name[40], capital[40]; int population; public: Country(const char* cou = nullptr, const char* cap = "NONE", int pop = 0); const char* GetName() const; const char* GetCapital() const; int GetPopulation() const; void Set(const char* cou = "Russia", const char* cap = "Moscow", int pop = 143000000); void Show() const; }; Country::Country(const char* cou, const char* cap, int pop) { strncpy(name, cou, 39); strncpy(capital, cap, 39); population = pop; } const char* Country::GetName() const { return name; } const char* Country::GetCapital() const { return capital; } int Country::GetPopulation() const { return population; } void Country::Set(const char* cou, const char* cap, int pop) { strncpy(name, cou, 39); strncpy(capital, cap, 39); population = pop; } void Country::Show() const { cout << GetName() << "-" << GetCapital() << "-" << GetPopulation() << endl; } int main() { Country c1; cout << "Show object c1:"; c1.Show(); char name[40], capital[40], line[100]; int population; cin.getline(line, 100); sscanf(line, "%s %s %d", name, capital, &population); Country c2(name, capital, population); cout << "Show object c2:"; c2.Show(); cin.getline(line, 100); sscanf(line, "%s %s %d", name, capital, &population); cout << "Reset and Show object c1:"; c1.Set(name, capital, population); c1.Show(); cout << "Reset and Show object c2:"; c2.Set(); c2.Show(); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值