如何将CString转换为const char *?

问题描述:

我想将CString转换为const char *,我使用了const char* cstr = (LPCTSTR)CString;但它不能编译,所以如何做到这一点,或者如何将CString转换为double,我使用了_tstof这个方法,但是当它传递给我时,它返回0 CString的它,所以我要转换的CString为const char *序通过转换后的值ATOF(方法),这里有一个例子:如何将CString转换为const char *?

int nTokenPos=0; 
CString leftDigit,rightDigit; 
double firstNum,secondNum; 

if(dialog->myValue.Find('X')!=-1){ 
CString resToken = dialog->myValue.Tokenize(_T("X"), nTokenPos); 
leftDigit=resToken; 
OutputDebugString(leftDigit); 
while(!resToken.IsEmpty()) 
{ 
    resToken = dialog->myValue.Tokenize(_T("X"), nTokenPos); 
    rightDigit=resToken; 
    rightDigit+="\n"; 
    //OutputDebugString(rightDigit); 
} 
firstNum= _tstof(leftDigit); 
secondNum=_tstof(rightDigit); 
OutputDebugString(leftDigit); 
OutputDebugString(rightDigit); 
TRACE("First_Number %d\n",firstNum); --->OutPuts ZERO 
TRACE("\nSecond_Number %d\n",secondNum); --->OutPuts ZERO 
//MathFuncs::MyMathFuncs::Multiply(firstNum,secondNum); 
TRACE("The result %d\n",MathFuncs::MyMathFuncs::Multiply(firstNum,secondNum)); 
+0

你能展示一个例子,你如何传递它并得到结果'0'? –

此行

const char* cstr = (LPCTSTR)CString; 

不编译是因为我猜你正在构建项目的UNICODE版本,因此_T扩展为2字节字符(宽字符)。

要使此转换工作,您可以使用ATL宏。像:

USES_CONVERSION; 
const char* cstr = T2A((LPCTSTR)CString); 

然而,这是不是真的如你正在使用反正_tstof(),该处理_T问题为您与您最初的问题。

[编辑]:

的错误是在其他地方。 TRACE的格式字符串没有使用wright占位符作为float/double。而不是%d使用%f:

CString leftDigit = _T("12.5"); 
double firstNum = _tstof(leftDigit); 
TRACE(_T("%f\n"), firstNum); 

我试过这个,得到12.50000000印在VS的输出窗格。

+0

通过使用'firstNum = _tstof((LPCTSTR)leftDigit);'它仍然没有工作! –

+0

关于T2A()的一点说明。我认为它只是将2个字节的字符截断为单字节字符。我不认为它做了从双字节表示到单字节表示的正确转换。如果你正在构建UNICODE,但你所有的字符串都只是ANSI而不是问题。但是如果你确实在那里得到了不在ANSI范围内的Unicode字符,你会想要使用一个API来正确转换为UTF-8。 [WideCharToMultiByte](http://msdn.microsoft.com/en-us/library/windows/desktop/dd374130(v = vs.85).aspx)是一个Windows API,它可以为你做到这一点。 – Nerdtron

+1

@Nerdtron不,那些ATL宏也使用:: WideCharToMultiByte。但是,它们总是采用ASCII字符串(CP_ACP)并将它们转换为UTF-16。所以如果你想/不得不处理其他转换,你不能拿走它们。 – Clemens

我不确定你是否使用UNICODE。您应该使用通用文本映射。 无论如何:

CString csTest(_T("Test")); 

const TCHAR* cstr = (LPTSTR)(LPCTSTR)csTest; 
+0

为什么要将一个非常量字符串赋值给一个常量字符串的指针? :) – Clemens