从CString转换为char * / TCHAR *

时间:2011-08-24 11:30:02

标签: c++ visual-c++ mfc atl cstring

我很清楚将CString转换为C风格字符的技巧。其中一个是使用strcpy / _tcscpy,其他人则使用CStrBuf

问题:

char Destination[100];
CStringA Source; // A is for simplicity and explicit ANSI specification.

Source = "This is source string."

现在我想要这个:

Destination = Source;

自动发生。那么,逻辑上意味着在CString类中编写转换运算符。但是,虽然它是隐含的,但我没有特权来更改CString类。

我想过编写一个全局转换opertor和全局赋值运算符。但它不起作用:

operator char* (const CStringA&); // Error - At least must be class-type
operator = ... // Won't work either - cannot be global.

是的,绝对可以编写函数(最好是模板函数)。但这涉及调用函数,并且它不像指派运算符那样平滑。

3 个答案:

答案 0 :(得分:2)

您无法分配数组。这使你想要的东西变得不可能。而且,老实说,这是一个非常错误的事情 - 魔术数量大小的缓冲区?

答案 1 :(得分:1)

好吧,我不想说这在任何方面都是值得推荐的,但你可以劫持一些较少使用的运算符来快速破解:

void operator<<=(char * dst, const std::string & s)
{
  std::strcpy(dst, s.c_str());
}

int main()
{
  char buf[100];
  std::string s = "Hello";

  buf <<= s;
}

你甚至可以为静态大小的数组安装一个中等安全模板版本:

template <typename TChar, unsigned int N>
inline void operator<<=(TChar (&dst)[N], const std::string & s)
{
  std::strncpy(dst, s.c_str(), N);
}

答案 2 :(得分:0)

CString上的运算符无法解决问题,因为您需要复制到Destination缓冲区,尽管此赋值会更改Destination的值,这是不可能的。

不知何故,你需要一个操作员来实现这一行:

strcpy(Destination, LPCSTR(Source)); // + buffer overflow protection

正如您所看到的,转换Source只有一半。您仍然需要复制到目标缓冲区。

此外,我不推荐它,因为Destination = Source行在char[]语义方面完全具有误导性。

唯一可能的此类任务是初始化目的地:

char Destination[100] = Source;