我正在尝试对一些遗留代码进行更改。我需要char[] ext
用使用filename.Right(3)
. 问题是我不知道如何从 a 转换CStringT
为 a char[]
。
必须有一个非常简单的解决方案,我只是没有意识到......
TIA。
如果您可以访问 ATL,我想您在使用 CString 时可以这样做,那么您可以查看CT2CA 等ATL 转换类。
CString fileExt = _T ("txt");
CT2CA fileExtA (fileExt);
如果需要执行转换(如为 Unicode 编译时),则 CT2CA 分配一些内部内存并执行转换,破坏其析构函数中的内存。如果为 ANSI 编译,则不需要执行转换,因此它只是挂在指向原始字符串的指针上。它还提供了隐式转换,const char *
因此您可以像使用任何 C 样式字符串一样使用它。
这使得转换变得非常容易,但需要注意的是,如果您需要在 CT2CA 超出范围后继续使用字符串,那么您需要将字符串复制到您控制的缓冲区中(而不仅仅是存储指向它的指针)。否则,CT2CA 会清理转换后的缓冲区,并且您有一个悬空参考。
好吧,即使在 unicode 中,您也可以随时执行此操作
char str[4];
strcpy( str, CStringA( cString.Right( 3 ) ).GetString() );
如果您知道您没有使用 unicode,那么您可以这样做
char str[4];
strcpy( str, cString.Right( 3 ).GetString() );
原始代码块所做的只是将最后 3 个字符转换为非 unicode 字符串(CStringA、CStringW 肯定是 unicode,CStringT 取决于是否设置了 UNICODE 定义),然后将字符串作为简单的 char 字符串。
首先使用 CStringA 来确保你得到char
而不是wchar_t
. 然后只需将其转换为 (const char *) 以获取指向字符串的指针,并使用 strcpy 或类似的东西复制到您的目的地。
如果您完全确定您将始终复制 3 个字符,则可以通过简单的方式进行操作。
ext[0] = filename[filename.Length()-3];
ext[1] = filename[filename.Length()-2];
ext[2] = filename[filename.Length()-1];
ext[3] = 0;
我相信这就是您正在寻找的:
CString theString( "This is a test" );
char* mychar = new char[theString.GetLength()+1];
_tcscpy(mychar, theString);
如果我记得我的老学校 MS C++。
您没有指定 CStringT 类型的来源。它可以是任何东西,包括您自己实现的字符串处理类。假设它是 Visual C++ 中可用的 MFC/ATL 库中的 CStringT,您有几个选择:
如果您使用或不使用 Unicode 进行编译,则没有说明,因此使用TCHAR
not表示char
:
CStringT
<
TCHAR,
StrTraitMFC
<
TCHAR,
ChTraitsCRT<TCHAR>
>
> file(TEXT("test.txt"));
TCHAR* file1 = new TCHAR[file.GetLength() + 1];
_tcscpy(file1, file);
如果您使用专门用于 ANSI 字符串的 CStringT,则
std::string file1(CStringA(file));
char const* pfile = file1.c_str(); // to copy to char[] buffer