Mfc 如何将CString转换为const char*?

Mfc 如何将CString转换为const char*?,mfc,double,cstring,Mfc,Double,Cstring,我想将CString转换为constchar*,我使用了constchar*cstr=(LPCTSTR)CString但是它不编译,所以如何做,或者如何将CString转换为double,我使用了这个方法,但是当我向它传递CString时它返回0,所以我想将CString转换为const char*以便将转换后的值传递给方法atof(),下面是一个示例: int nTokenPos=0; CString leftDigit,rightDigit; double firstNum,secondNu

我想将CString转换为constchar*,我使用了
constchar*cstr=(LPCTSTR)CString
但是它不编译,所以如何做,或者如何将CString转换为double,我使用了这个方法,但是当我向它传递CString时它返回0,所以我想将CString转换为const char*以便将转换后的值传递给方法atof(),下面是一个示例:

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));
这条线

const char* cstr = (LPCTSTR)CString;
不编译,因为我猜您正在构建项目的UNICODE版本,因此扩展为2字节字符(宽字符)

要使此转换工作,可以使用ATL宏。比如:

USES_CONVERSION;
const char* cstr = T2A((LPCTSTR)CString);
但是,这实际上与您最初的问题无关,因为您使用的是为您处理问题的_tstof()

[编辑]:

错误在别的地方。跟踪的格式字符串未将wright占位符用于float/double。使用%f代替%d:

CString leftDigit = _T("12.5");
double  firstNum = _tstof(leftDigit);
TRACE(_T("%f\n"), firstNum);
我试过了,在VS的输出窗格中打印了12.50000000

const char* cstr = (LPCTSTR)CString;
不编译,因为我猜您正在构建项目的UNICODE版本,因此扩展为2字节字符(宽字符)

要使此转换工作,可以使用ATL宏。比如:

USES_CONVERSION;
const char* cstr = T2A((LPCTSTR)CString);
但是,这实际上与您最初的问题无关,因为您使用的是为您处理问题的_tstof()

[编辑]:

错误在别的地方。跟踪的格式字符串未将wright占位符用于float/double。使用%f代替%d:

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

我尝试了这个,在VS的输出窗格中打印了12.50000000。我不确定您是否使用UNICODE。您应该使用通用文本映射。 无论如何:


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


你能举例说明你是如何传入并得到结果的吗?你能举例说明你是如何传入并得到结果的吗?方法是使用“firstNum=_tstof((LPCTSTR)leftDigit);”它仍然不存在;不行!!关于T2A()的一个注释。我认为它只是将2字节字符截断为单字节字符。我不认为它能正确地从双字节表示转换为单字节表示。如果您正在构建UNICODE,但所有字符串实际上都是ANSI,那么这不是问题。但是如果你真的得到了不在ANSI范围内的Unicode字符,你会希望使用一个API来正确地转换成UTF-8。是一个Windows API,可以为您实现这一点。@Nerdtron不,那些ATL宏也使用::wideChartMultiByte。但是,它们总是采用ASCII字符串(CP_ACP)并将其转换为UTF-16。因此,如果你想/必须处理其他转换,你不能接受它们。好吧,那么同样的事情也适用——它们将截断任何实际使用2字节的内容,因此如果你想处理这些情况,你需要进行适当的转换(在调用WideChartMultiByte时使用不同的参数)。是的,例如,从UTF-8到UTF-16的转换将不起作用。请使用“firstNum=_tstof((LPCTSTR)leftDigit);”它仍然不存在;不行!!关于T2A()的一个注释。我认为它只是将2字节字符截断为单字节字符。我不认为它能正确地从双字节表示转换为单字节表示。如果您正在构建UNICODE,但所有字符串实际上都是ANSI,那么这不是问题。但是如果你真的得到了不在ANSI范围内的Unicode字符,你会希望使用一个API来正确地转换成UTF-8。是一个Windows API,可以为您实现这一点。@Nerdtron不,那些ATL宏也使用::wideChartMultiByte。但是,它们总是采用ASCII字符串(CP_ACP)并将其转换为UTF-16。因此,如果你想/必须处理其他转换,你不能接受它们。好吧,那么同样的事情也适用——它们将截断任何实际使用2字节的内容,因此如果你想处理这些情况,你需要进行适当的转换(在调用WideChartMultiByte时使用不同的参数)。是的,例如,从UTF-8到UTF-16的转换将不起作用。为什么要将非常量字符串分配给指向常量字符串的指针?:)为什么要将非常量字符串分配给指向常量字符串的指针?:)