2009-08-06 15 views
3

我试图对一些遗留代码进行更改。我需要填写一个char[] ext,文件扩展名是filename.Right(3)。问题是我不知道如何将CStringT转换为char[]CStringT为char []

必须有,我只是没有实现一个非常简单的解决方案......

TIA。

+2

谁说所有扩展名都是3个字符?你应该找到最后一个。 (点)并复制字符串的其余部分 – Anders 2009-08-06 19:44:10

+0

这是一个商业项目。我们所有的扩展名都是3个字符。 – Justin 2009-08-07 12:41:36

+0

直到他们没有的那一天。 – jalf 2010-01-24 04:00:57

回答

4

那么你总是可以做到这一点,即使在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定义),然后将该字符串作为简单字符串获取。

+0

这似乎是我的情况最好的解决方案。谢谢! – Justin 2009-08-06 18:28:07

5

如果您有权访问ATL,我想如果您使用的是CString,那么您可以查看ATL conversion classes,如CT2CA。

CString fileExt = _T ("txt"); 
CT2CA fileExtA (fileExt); 

如果转换需要执行(Unicode的编译时为),然后CT2CA分配一些内部存储器并执行转换,破坏在其析构函数存储器中。如果编译为ANSI,则不需要执行任何转换,因此它只是挂在指向原始字符串的指针上。它还提供到const char *的隐式转换,因此您可以像使用任何C风格的字符串一样使用它。

这使得转换变得非常简单,需要注意的是,如果您需要在CT2CA超出范围之后挂在字符串上,则需要将该字符串复制到您控制的缓冲区中(而不仅仅是存储指针到它)。否则,CT2CA会清理已转换的缓冲区,并且您有一个悬挂参考。

0

首先使用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; 
0

我相信这是你在找什么:

CString theString("This is a test"); 
char* mychar = new char[theString.GetLength()+1]; 
_tcscpy(mychar, theString); 

如果我记得我的老同学MS C++。

+0

当UNICODE被定义时,这不会被编译。 _tcscpy需要两个TCHAR缓冲区。如果定义了UNICODE,则需要使用WideCharToMultiByte执行实际的字符集转换。 – 2009-08-06 17:44:46

+0

啊,够公平的。自从我使用ATL或MFC以来已经有一段时间了。 – 2009-08-06 18:12:17

0

您不指定CStringT类型来自哪里。它可以是任何东西,包括你自己的字符串处理类的实现。假设这是CStringT从MFC/ATL库在Visual C++中,你有几种选择:

,如果你有或无统一编译它不是已经说了,用TCHARchar这样呈现:

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