quiero convertir CString a const char*, yo que const char* cstr = (LPCTSTR)CString; pero no se compila,entonces, ¿cómo hacer eso, o cómo convertir CString el doble, he utilizado este método _tstof pero devuelve 0 cuando pasé un objeto CString, así que quiero convertir CString a const char* finde para pasar el valor convertido en el método atof(), he aquí un ejemplo:

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));
  • Podrías mostrar un ejemplo de cómo pasar de él y obtener el resultado 0?
InformationsquelleAutor Java Player | 2012-09-25

2 Comentarios

  1. 1

    Esta línea

    const char* cstr = (LPCTSTR)CString;
    

    no compila porque supongo que usted está construyendo una versión UNICODE de su proyecto y, por tanto, _T se expande a una de 2 bytes de caracteres (un carácter).

    Para hacer esta conversión de trabajo que usted puede utilizar las macros ATL. Como:

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

    Sin embargo, esta realidad no está relacionada con su problema inicial como usted está usando de todos modos _tstof() que se encarga de la _T problemas para usted.

    [Editado]:

    El error está en otro lugar. La cadena de formato de la TRAZA no es el uso de la wright marcador de posición para un float/double. En lugar de %d uso %f:

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

    He intentado esto y tengo 12.50000000 impreso en el panel de Salida de VS.

    • mediante el uso de » firstNum= _tstof((LPCTSTR)leftDigit);’ todavía no’; t trabajo!!
    • Una nota acerca de la T2A(). Creo que todo se trunca la 2-caracteres de byte en byte chars. No creo que se hace una conversión adecuada de dos bytes representación a un solo byte de la representación. Si usted está construyendo UNICODE, pero todos sus cadenas son realmente sólo ANSI entonces eso no es un problema. Pero si usted realmente conocer los caracteres Unicode en que no están dentro de la norma ANSI gama, usted querrá usar una API que iba a hacer una adecuada conversión a UTF-8. WideCharToMultiByte es una API de Windows que iba a hacer esto para usted.
    • No, los macros ATL también el uso de ::WideCharToMultiByte. Sin embargo, ellos siempre que suponga una cadena ASCII (CP_ACP) y convertir a UTF-16. Así que si quieres/tienes que lidiar con otras conversiones que no se pueden tomar.
    • ok, así que lo mismo se aplica, entonces, van a truncar cualquier cosa que, en realidad, es el uso de los 2 bytes y por lo que tendríamos que hacer una conversión adecuada (utilizando diferentes argumentos en una llamada a sí mismo a WideCharToMultiByte) si usted quiere ser capaz de manejar esos casos.
    • Sí, una conversión de UTF-8, UTF-16 no trabajo, por ejemplo.
  2. 0

    No estoy seguro de si usted está usando UNICODE o no. Usted debe utilizar el término genérico de texto de asignación.
    De todos modos:

    CString csTest(_T("Test"));
    
    const TCHAR* cstr = (LPTSTR)(LPCTSTR)csTest;
    
    • ¿Por qué asignar un no-const string a un puntero a una constante de cadena de caracteres? 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here